android TraceView使用以及listview 的性能优化测试(一)

RK3572-Android16-记录一次OTA升级失败解决方案 这里记录一次解决RK3576 Android16 OTA 用Recovery 升级失败的一次解决案例,将部分经验作为总结。本次OTA升级耗时了几天,最终是RK给出的解决方案,再加上经验来解决了其它部分问题新平台,高一点的Android版本,可能本身有bug,多请教平台来,不要蒙着干,干不出来的。 阅读详情

 今天看了下文档,说TraceView 对程序的的性能和优化有很大的帮助:

本人比较懒,文章也没继续往下下看,直接百度了下TraceView  的使用技巧,资源很多,介绍怎么使用

 推荐:http://blog.youkuaiyun.com/itachi85/article/details/6857324

 当然具体怎么做的步骤简单的一下,大概分这么几步:

 一:在创建avd ,给sd卡的内存大一点,因为后面的debug.raceView  生成的文件可能比较的大。

二:写一个测试的程序: 

[html]  view plain copy
  1. Debug.startMethodTracing();  

有开始当然必须有结束,如果不掉用Debug.stopMethodTracing();  在sd卡的根目录上则不会出现dmtrace.trace 文件

 

[java]  view plain copy
  1. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>    


 

[html]  view plain copy
  1. note:建议在onPuse()方法中调用Debug.stopMethodTracing ,不建议在ondestory() 或者onstop()方法中调用,因为有可能程序在莫名的情况下不一定会走ondestory,和onstop ,所以在onpuse中比较的靠谱  

三: 运行前不要着急:记得给sd卡加权限 否则会抛权限异常的:

 

四: 生成了dmtrace.trace文件当然需要看了啊! 怎么看,google人性化,在android 开发工具中的 tools 中有个TraceView 工具只你只要

cmd 到该目录下,然后再把sd卡上的dmtrace.trace 文件导入到pc 的 某个路劲 (默认是的:c\dmtrace.trace)

然后执行:traceview C:\dmtrace.trace (自己的路劲哦)

物: 然后你就看打如下界面:

看到界面是不是晕了啊!:

这个咋看啊 ! 刚开始进来我也不知道看啥,也不知道怎么看,不懂百度:

原来:

[html]  view plain copy
  1. 在traceview的右半部统计字段中:  
[html]  view plain copy
  1. Exclusive: 同级函数本身运行的时间Inclusive 就是说除统计函数本身运行的时间外再加上调用子函数所运行的时间  
[html]  view plain copy
  1. Name:列出的是所有的调用项,前面的数字是编号,展开可以看到有的有Parent 和Children子项,就是指被调用和调用。  
[html]  view plain copy
  1. Incl: inclusive时间占总时间的白分比  
[html]  view plain copy
  1. Excl: 执行占总时间的白分比。  
[html]  view plain copy
  1. Calls+Recur Calls/Total: 调用和重复调用的次数  
  2. Time/Call: 总的时间。(ms)  
  3.   是不是明白了些  


本人还有个使用的心得,跟大家分享下: 就是你看到下面的数据这么多,又不知道看什么好时,最底下是不是有一个过滤栏,如果没有他你眼睛都会被晃瞎啊,因为数据太多了

好上面是简单的 TraceView  使用:

 

下面咋门用他来验证下,是不是有这么的神奇啊 !

不验证其他的就用他来验证我的Listview性能 ,这个问题很纠结我很长的一段时间了,因为listview优化网上给出了很多不同的版本和意见:

 

关于listView 优化的: http://www.cnblogs.com/over140/archive/2011/03/23/1991100.html

[java]  view plain copy
  1. package com.liao.listadpter;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import android.app.ListActivity;  
  7. import android.os.Bundle;  
  8. import android.os.Debug;  
  9.   
  10. public class MainActivity extends ListActivity {  
  11.     private List<String> data;  
  12.   
  13.     /** Called when the activity is first created. */  
  14.       
  15.     @Override  
  16.     public void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         //setContentView(R.layout.main);  
  19.         Debug.startMethodTracing();  
  20.           
  21.         initData();  
  22.           
  23.         initadapter();  
  24.         
  25.     }  
  26.     public void initData() {  
  27.       
  28.           
  29.         data = new ArrayList<String>();  
  30.           
  31.         for (int i = 0; i < 1000; i++) {  
  32.             data.add("test: " + i);  
  33.         }  
  34.     }  
  35.   
  36.     public void initadapter() {  
  37.           
  38.         TestAdapter testAdapter = new TestAdapter(data, MainActivity.this);  
  39.           
  40.         this.setListAdapter(testAdapter);  
  41.     }  
  42.   
  43.     @Override  
  44.     protected void onPause() {  
  45.         // TODO Auto-generated method stub  
  46.         super.onPause();  
  47.         Debug.stopMethodTracing();  
  48.     }  
  49. }  


adapter 信息

[java]  view plain copy
  1. package com.liao.listadpter;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.w3c.dom.Text;  
  6.   
  7. import android.content.Context;  
  8. import android.view.LayoutInflater;  
  9. import android.view.View;  
  10. import android.view.ViewGroup;  
  11. import android.widget.BaseAdapter;  
  12. import android.widget.ImageView;  
  13. import android.widget.LinearLayout;  
  14. import android.widget.TextView;  
  15.   
  16. public class TestAdapter extends BaseAdapter{  
  17.       
  18.     private List<String> listData;  
  19.     private Context context;  
  20.     private LayoutInflater inflater;  
  21.     private LinearLayout layout;  
  22.   
  23.     TestAdapter(List<String> listData ,Context context){  
  24.         this.listData =listData;  
  25.         this.context =context;  
  26.         inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);  
  27.     }  
  28.   
  29.     public int getCount() {  
  30.         // TODO Auto-generated method stub  
  31.         return listData.size();  
  32.     }  
  33.   
  34.     public Object getItem(int position) {  
  35.         // TODO Auto-generated method stub  
  36.         return listData.get(position);  
  37.     }  
  38.   
  39.     public long getItemId(int position) {  
  40.         // TODO Auto-generated method stub  
  41.         return position;  
  42.     }  
  43.   
  44.     public View getView(int position, View convertView, ViewGroup parent) {  
  45.         // TODO Auto-generated method stub  
  46.           
  47.         if(convertView ==null){  
  48.             layout = (LinearLayout) inflater.inflate(R.layout.listview, null);  
  49.               
  50.         }  
  51.           
  52.         else{  
  53.             layout = (LinearLayout) convertView;  
  54.         }  
  55.          int id= position %2==1? R.drawable.icon: R.drawable.default_head;  
  56.          ((ImageView) layout.findViewById(R.id.iamge)).setImageResource(id);  
  57.          ((TextView) layout.findViewById(R.id.text)).setText(listData.get(position));;  
  58.   
  59. //      TextView text = (TextView) layout.findViewById(R.id.text);  
  60. //      ImageView view= (ImageView) layout.findViewById(R.id.iamge);  
  61. //        
  62. //      text.setText(listData.get(position));  
  63.           
  64.       
  65.           
  66.         return layout;  
  67.     }  
  68.      static class ViewHoder{  
  69.         public TextView text;  
  70.         public ImageView view;  
  71.           
  72.     }  
  73.   
  74. }  


 下面是xml

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="wrap_content"  
  4.     android:layout_height="wrap_content"  
  5.     android:orientation ="horizontal"  
  6.     >  
  7. <TextView    
  8.     android:layout_width="wrap_content"   
  9.     android:layout_height="wrap_content"   
  10.     android:text="list 1"  
  11.     android:id ="@+id/text"  
  12.     android:layout_gravity = "center_vertical"  
  13.     />  
  14. <ImageView    
  15.     android:layout_width="wrap_content"   
  16.     android:layout_height="wrap_content"   
  17.     android:id ="@+id/iamge"  
  18.     android:src ="@drawable/icon"  
  19.     />  
  20. </LinearLayout>  


效果图:


好现在咋门来验证listView 的神奇,listview主要需要优化的就是getView() 这个方法,实现其中convertView 的缓存优化,下面就利用TraceView 测试下listview重用convertView  的区别:

 首先啥都不做:

   

[html]  view plain copy
  1. public View getView(int position, View convertView, ViewGroup parent) {  
  2.         // TODO Auto-generated method stub  
  3.         LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.listview, null);  
  4.         TextView text = (TextView) layout.findViewById(R.id.text);  
  5.         ImageView view= (ImageView) layout.findViewById(R.id.iamge);  
  6.           
  7.         text.setText(listData.get(position));  
  8.         int id= position %2==1? R.drawable.icon: R.drawable.default_head;  
  9.         view.setImageResource(id);  
  10.           
  11.         return layout;  
  12.     }  


运行程序,然后随意的拖动listview 列表,然后安菜单键退出程序:   去ddms 中fileExplorer中 点击sd卡 你会早根目录上看到dmtrace.trace 文件

 把dmtrace.trace 导出到C盘 ,命令行键入android  tools 文件夹下 执行  traceview C:\ dmtrace.trace   出现了traceview   视图

因为咋门看到的是getview优化操作:所以直接在Find: 键入getView 他则会找到我们写的程序的方法:

 看到没有:未进行优化的情况下:getView占用资源是 35.2%   其中布局填充(inflate)占其中的89.7%    整个程序中inflated 就占33%,getView()方法就是全被布局填充耗费了这么多的资源, 看不下去了

优化一

直接加两行代码:

[java]  view plain copy
  1. if(convertView ==null){  
  2.         layout = (LinearLayout) inflater.inflate(R.layout.listview, null);  
  3.     }else{  
  4.         layout =(LinearLayout) convertView;  
  5.     }  

  在运行 ,在查看getview:


看到没有,看到没有:9.4%  占整个程序的9.4% ,并且 inflated 在getview中只耗费了41.7%了,一半多的节省啊!

两行的代码就带来这么大的效率提高: 难道你没觉察到! 神奇

 

优化二

下面是网上盛传的:ViewHolder 优化测试 通过setTAG

[java]  view plain copy
  1. public View getView(int position, View convertView, ViewGroup parent) {  
  2.         // TODO Auto-generated method stub  
  3. //      LinearLayout layout;  
  4. //      if(convertView ==null){  
  5. //          layout = (LinearLayout) inflater.inflate(R.layout.listview, null);  
  6. //      }else{  
  7. //          layout =(LinearLayout) convertView;  
  8. //      }  
  9. //        
  10. //      TextView text = (TextView) layout.findViewById(R.id.text);  
  11. //      ImageView view= (ImageView) layout.findViewById(R.id.iamge);  
  12. //        
  13. //      text.setText(listData.get(position));  
  14. //      int id= position %2==1? R.drawable.icon: R.drawable.default_head;  
  15. //      view.setImageResource(id);  
  16.           
  17.          ViewHolder holder;  
  18.          if (convertView == null) {  
  19.              convertView = inflater.inflate(R.layout.listview,  
  20.                      null);  
  21.              holder = new ViewHolder();  
  22.              holder.view = (ImageView) convertView.findViewById(R.id.iamge);  
  23.              holder.text = (TextView) convertView.findViewById(R.id.text);  
  24.              convertView.setTag(holder);  
  25.          }  
  26.          else{  
  27.              holder = (ViewHolder)convertView.getTag();  
  28.          }  
  29.          int id= position %2==1? R.drawable.icon: R.drawable.default_head;  
  30.          holder.view.setImageResource(id);  
  31.          holder.text.setText(listData.get(position));  
  32.   
  33.           
  34.         return convertView;  
  35.     }  
  36.      static class ViewHolder {  
  37.             TextView text;  
  38.             ImageView view;  
  39.         }  

  测试效果是比 优化一 好点点: 主要在于findviewbyID 比findviewbyTag少了很多


优化三

[java]  view plain copy
  1. if (convertView == null) {  
  2.              convertView = inflater.inflate(R.layout.listview, null);  
  3.              convertView.setTag(R.id.text, convertView.findViewById(R.id.text));  
  4.              convertView.setTag(R.id.iamge, convertView.findViewById(R.id.iamge));  
  5.          }  
  6.          ((TextView) convertView.getTag(R.id.text)).setText(listData.get(position));  
  7.          int id= position %2==1? R.drawable.icon: R.drawable.default_head;  
  8.          ((ImageView) convertView.getTag(R.id.iamge)).setImageResource(id);  


 大家也看到了。跟优化一是差不多的最终的效果

也许结果不是很准确,但至少我们知道了怎么使用traceView 来帮助我们,同时也知道了listview一定的优化,具体采用哪种优化还需要看具体的需求,

对于性能要求很高的 推荐,优化二,对于一般的应用优化一足够了,再有就是settag 和findbyid 使用情况,经过测试证明了:

View本身因为setTag而会占用更多的内存,还会增加代码量;而findViewById会临时消耗更多的内存,所以不可盲目使用,依实际情况而定。

 转载出处: http://blog.youkuaiyun.com/liao3841054/article/details/7162181
PDF.js实现分片加载问题 PDF.js实现分片加载问题。 阅读详情

相关推荐

车载与安防项目实战:如何用RK3588搭配NVP6158C实现4路AHD摄像头BT1120接入与同步预览

本文详细解析了基于RK3588处理器与NVP6158C解码芯片实现4路AHD摄像头BT1120接入与同步预览的技术方案。针对车载环视和安防监控场景,重点探讨了硬件架构设计、BT1120接口配置、多路同步机制及Android HAL适配等核心问题,提供了从底层驱动到上层应用的完整实现路径,为相关领域的工程实践提供可靠参考。

weixin_30571465的博客 484

android自定义listview格式动态更新显示数据测试

package com.example.mylistview; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Timer; import java.util.TimerTask; import android.

shareinfo2018 900

TOEIC托业词汇汇总(完整版)

1.appointment 约会,约定2.attendance 出席人数;出席3.cabinet 橱柜4.calendar 日历;月历;行事历5.clerk 办事员,书记6.directory 人名住址薄7.duplicte 复制;副本8.filing 归档9.in-tray 待处理文件盒10.monitor 检测;监视;追踪11.out-tray 已处理文件盒12.partition 分隔;分隔物(如墙壁等)13.postage 邮费。

weixin_39676449的博客 1万+

listview,gridview 邪恶的wrap_content高度属性导致数据错乱

最近使用listview和gridview,需要高度自适应,采用了wrapcontent属性,数据少一行刷新数据后,会显示删除的哪一行,但是点击不了,各种尝试都不行,最后给listview添加了一个 LinearLayout,LinearLayout设置wrap_content,listview设置高度为match_parent属性,测试OK,gridview换成同样的方法,也OK,再此记录下来

chunjunlu的专栏 1635

告别软件轮询!用STM32G474的COMP比较器实现纳秒级硬件过压保护(CubeMX配置详解)

本文详细介绍了如何利用STM32G474的COMP比较器实现纳秒级硬件过压保护,通过CubeMX配置详解,展示了硬件比较器相比传统软件轮询方案在响应时间、CPU占用和可靠性等方面的显著优势。文章还提供了实战配置流程和优化技巧,帮助工程师快速构建高效的硬件保护系统。

weixin_28683689的博客 351

STM32C8T6HAL库实战:MAX30102心率血氧检测与OLED多级菜单一体化方案

本文详细介绍了基于STM32C8T6和HAL库的MAX30102心率血氧检测与OLED多级菜单一体化方案。内容涵盖硬件连接、CubeMX工程配置、传感器驱动移植、数据滤波算法、OLED显示驱动以及高效的多级菜单系统设计,旨在提供一个稳定、实用且易于移植的嵌入式健康监测项目参考。

weixin_29256771的博客 396

android TraceView使用以及listview 的性能优化测试(一) .

本文出自:http://blog.youkuaiyun.com/liao3841054/article/details/7162181    今天看了下文档,说TraceView 对程序的的性能和优化有很大的帮助: 本人比较懒,文章也没继续往下下看,直接百度了下TraceView  的使用技巧,资源很多,介绍怎么使用  推荐:http://blog.youkuaiyun.com/itachi85/article/

fly_zdf的专栏 338

别光看教程了!手把手带你用STM32F103C8T6最小系统板点亮第一个LED(附完整电路图)

本文详细介绍了如何使用STM32F103C8T6最小系统板点亮第一个LED,从硬件连接到软件开发环境搭建,再到编写和下载程序,手把手教你完成STM32入门的第一步。适合初学者快速上手STM32开发,附完整电路图和代码示例。

weixin_28678831的博客 194

android TraceView使用以及listview 的性能优化测试(二)

接上篇的 android TraceView使用以及listview 的性能优化测试(一) 上篇最后面给了我测试用的代码: 未看到请先浏览上一篇: 好现在咋门来验证listView 的神奇,listview主要需要优化的就是getView() 这个方法,实现其中convertView 的缓存优化,下面就利用TraceView 测试下listview重用convertView  的区别:  首

2112

Zotero+WPS文献引用跳转功能缺失?3分钟教你用VBA宏搞定(附完整代码)

本文针对WPS用户使用Zotero时文献引用无法点击跳转的痛点,提供了一套完整的VBA宏解决方案。通过解析Zotero的域代码,自动在文内引用和文末参考文献之间创建超链接,实现一键跳转,极大提升了学术写作与文献查阅的效率。

weixin_28419039的博客 671

基于OpenCV的实时疲劳检测系统实现

本文介绍了一个基于OpenCV的实时疲劳检测系统,使用Python实现。系统通过Haar级联分类器检测人脸和眼睛,计算眼睛宽高比(EAR)和PERCLOS(眼睛闭合时间比例)来评估疲劳程度,分为4个等级:正常、轻度、中度和重度疲劳。核心代码包含人脸眼睛检测、疲劳评估和可视化显示功能,具有实时性、稳定性和直观的视觉反馈。系统可通过摄像头实时监控驾驶员状态,为疲劳驾驶预警提供简单有效的解决方案。

weixin_62135607的博客 232

Android学习札记43:TraceView实战篇

本篇文章中记录了使用 TraceView 对 ListView 进行性能优化的完整过程 首先啥都不做: public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub LinearLayout layout = (LinearLayo

L_YQing的专栏 1181

自注意力机制(SelfAttention Mechanism)原理与代码实战案例讲解

自注意力机制(Self-Attention Mechanism)原理与代码实战案例讲解 作者:禅与计算机程序设计艺术 / Zen and the Art of Computer Programming 1. 背景介绍

AI天才研究院 1290

性能优化(七)

1,如何对android应用进行性能分析以及优化?2,ddms 和 traceView答:DDMS:DDMS 【Dalvik Debug Monitor Service】是安卓(android)开发环境中的Dalvik虚拟机调试监控服务。DDMS能够提供:测试设备截屏,针对特定的进程查看正在运行的线程以及堆信息、Logcat、广播状态信息、模拟电话呼叫、接收SMS、虚拟地理坐标等。TraceVie...

fajuary的专栏 983

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

2015年Android开发技术栈与最佳实践回顾

Android开发在2015年经历了重大技术演进,Material Design的全面应用和Gradle构建系统的普及标志着开发范式的转变。从基础组件如Activity、Service的优化,到新兴的RecyclerView、CardView等UI组件,技术栈的升级为应用性能提升和用户体验改善奠定了基础。关键开发工具如Android Studio的成熟和第三方库如Retrofit、RxJava的兴起,推动了模块化设计和响应式编程的实践。这些技术进步不仅解决了内存管理、线程优化等工程难题,更为电商、社交等高频

weixin_30613727的博客 305

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

android 面试题

ContextImpl.startActivity → Instrumentation.execStartActivity → AMS.startActivity → 校验权限、创建 ActivityRecord、Pause 当前 Activity → ApplicationThread.scheduleTransaction → ActivityThread.H → LaunchActivityItem → performLaunchActivity(创建 Activity、调用 onCreate)。

qq_25657125的博客 397

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

具身智能 2026:启元人形机器人开发者生态的“安卓时刻”来了吗

一个贯穿全文的问题:人形机器人开发者生态,是否正从「封闭垂直」走向「开源平台化」?本文以开源底座的公开数据为标尺,盘点 SDK、URDF、仿真与技能分发的开放程度,并落回启元机器人的开源路径。所有关键数据均标注来源,文末附社区与学堂链接。

在北风吹起的时候加入我们的队伍 在秋雨到来的时候成为彼此的温暖 758

android-ad-cleaner:android免 Root 批量关闭系统开屏与营销推送

橘子,计算机视觉方向工程师,深耕 AIGC 与多媒体处理领域,专注技术实用化落地。本文为原创内容,转载请注明来源与作者。优快云 首发 | 版权所有 © 2026。

下载资源或查看教程前,请务必阅读置顶的《免责声明》 536

Android 14 SELinux策略深度解析

init 的全局公开约束(如 neverallow init execute_no_trans,放 public 才能约束所有分区的规则)这就是"哪些可见"的强制机制。alps_s0(MTK 工程)的 device/mediatek/sepolicy/basic/ 提供。所有分区(system/system_ext/product/vendor)都可引用。init的公开约束、跨分区共用的 type/attribute/neverallow。——vendor 的 .cil 只能引用 plat 的。

新时代农民工 105

Android 开发入门实践(二):Kotlin 空安全,从可空类型到安全访问

延续 NewsApp 项目中的新闻标题练习,记录 Kotlin 安全调用。

Easyhood的博客 281

Android 模块化收口:能力组合框架、手写 LifecycleOwner 与热修复共存

二十多个模块业务高度相似却各有差异,核心矛盾在于“统一与灵活”的平衡。通过角色接口组合(如IProjectAware、IVoiceAware)实现能力按需注入,新增功能零侵入;用模板方法锁定生命周期流程,确保顺序一致;结合@CallSuper与工厂方法,既约束关键逻辑,又保留子类自由。最终实现:骨架统一、填空自由,管得住业务,又不侵入业务。

mmsx990的博客 396

Android Message源码阅读

本文梳理了Android Handler机制中Message的核心设计:链表结构、消息复用池(sPool)及回收机制,重点解析了异步消息与同步屏障(SyncBarrier)的协同机制。当主线程需优先处理UI绘制等高优先级任务时,系统通过postSyncBarrier插入屏障,使Looper跳过普通同步消息,优先执行标记为异步的UI渲染任务,确保帧率流畅。该机制是保障Android界面响应性的关键技术之一。

u012116089的博客 196

安卓部署Linux性能实测:一颗移动处理器,能否胜任日常 Linux 开发?

本文通过在一加Ace5上部署NimoteCode的ARM64 Linux环境,测试了其在CoreMark、SQLite编译及并行构建中的表现。结果显示,尽管单核性能约2.34GHz,多核扩展比达6.15×,但优化编译耗时仍高达35秒,反映移动处理器虽具备一定开发能力,却受限于文件系统开销与运行环境(如PRoot)。实际开发中,非优化构建效率较高,而并行编译可显著提速。结论:安卓手机可作为轻量级开发辅助工具,但无法替代桌面环境,真正价值在于便携性与即时响应,而非全功能替代。

一个不知名码农的专栏 300
下一篇: Eclipse中的方法代码收缩和行号显示问题
android_xiaozhou
博客等级 码龄14年 14粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值