android如何提升性能技巧(下)

举报
ShaderJoy 发表于 2021/12/30 02:01:51 2021/12/30
【摘要】 1.什么是TraceView? 先看下百度出来的解释吧: Traceview是android平台配备一个很好的性能分析的工具。它可以通过图形化的方式让我们了解我们要跟踪的程序的性能,并且能具体到method。   关于Traceview的使用   首先,必须在程序当中加入代码,以便生成trace文件,有了这个trace文件才可以将...

1.什么是TraceView?

先看下百度出来的解释吧:






  
  1. // start tracing to "/sdcard/yourActivityTrace.trace"
  2.   Debug.startMethodTracing("yourActivityTrace");
  3. // ... stop tracing
  4. Debug.stopMethodTracing();
因此决定在onStop()中来调用Debug.stopMethodTracing()



  之后就可以看到图形了,接下来就是按照Google Dev Guide中的解释去分析图形就OK了。

下面来看如何实现以及需要注意的地方:
实现的步骤分为三步:1.必须先在我们的模拟器中创建sdCard ;2.将我们的调试代码嵌入工程;3.利用TraceView来观察和分析代码情况;

1.对于创建模拟器的sdCard这里写出两种方式:

第一种:我们在eclipse中创建avd的时候的时候 在选择api下面有个 Sd Card 的选项,第一项填入创建sdcard的大小即可。

第二种:cmd 命令! 打开cmd 并且cd 到android sdk tool 路径下;(或者在环境变量Path中将sdk tool路径配置上,然后重新打开cmd)
使用 mksdcard -l mycard 1024M F:/mysdcard.img 创建了一个1G的sdcard;
使用 emulator -avd my_android -sdcard F:/mysdcard.img 激活sdcard!
最后在eclipse Preferences-->Android-->Launch加入 -sdcard F:/mysdcard.img (此步骤就是在第一种创建方式中添加sdcard的支持)

备注1:
如果sdcard分配的空间太小,则程序追踪文件就一直记录到sd储蓄卡容量慢为止,所以调试前,要为程序生成一个适当的SD存储卡也较为重要,因为程序运行时间越长,这个追踪文件也就越大。

备注2;
(如果第二种创建方式中的第二部激活出现 emulator: ERROR: the user data image is used by another emulator. aborting,请关闭模拟器,或者进入目录: /Documents and Settings / 用户 / .android /的AVD / *设备* / (比如我的目录是:C:/Documents and Settings/Administrator/.android/avd/android2.0.avd)

然后删去以.lock结尾的文件夹就行(我简单解释下为什么要删除这些文件呢,其实.lock是加锁,如果程序崩溃等原因导致无法清除这些以.lock结尾的文件夹,就会出现这个问题,也就是这个avd的锁没有被释放,导致avd manager以为这个avd正在使用当中。))

2.将我们的调试代码嵌入工程

正如我们百度到的说明一样,在程序运行的开端加上  Debug.startMethodTracing("yourActivityTrace"); 然后在onPause()中调用Debug.stopMethodTracing(); 为什么要将结束写在onPause()中而不写在onStop(),那么如果你去看api的话,你会看到,Api中介绍onPause()会在你返回和点击home按键后触发,而onStop()一般是由系统来触发,当该程序处于后台的时候,而且当内存紧张的时候,可能会调用,但是可能永远不会调用到!
备注:要记住当把调试代码加入项目中以后不要立即运行项目,而是必须在AndroidMainfest.xml中定义一条"写入SD卡的权限"那么添加权限的代码如下:
因为咱们的调试代码会在SD卡中生成一个追踪文件,也就是往SD卡中写入了数据,所以需要声明一条权限。这里必须注意哦!


  
  1. 1 <?xml version="1.0" encoding="utf-8"?>
  2. 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. 3 package="com.himi"
  4. 4 android:versionCode="1"
  5. 5 android:versionName="1.0">
  6. 6 <application android:icon="@drawable/icon" android:label="@string/app_name">
  7. 7 <activity android:name=".MainActivity"
  8. 8 android:label="@string/app_name">
  9. 9 <intent-filter>
  10. 10 <action android:name="android.intent.action.MAIN" />
  11. 11 <category android:name="android.intent.category.LAUNCHER" />
  12. 12 </intent-filter>
  13. 13 </activity>
  14. 14 </application>
  15. 15 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
  16. 16 <uses-sdk android:minSdkVersion="4" />
  17. 17 </manifest>

3.运行项目并且退出项目从而得到的追踪文件,利用TraceView来进行分析代码运行状况:





















  
  1. 18
  2. 22 public void hot(Canvas canvas) {
  3. 23 for (int i = 1; i < 100; i++) {
  4. 24 Bitmap bmp = BitmapFactory.decodeResource(getResources(),
  5. 25 R.drawable.icon);
  6. 26 canvas.drawBitmap(bmp, i += 2, i += 2, paint);
  7. 27 }
  8. 28 }

















2.listview 性能优化

1).复用convertView


2).异步加载图片


3).快速滑动时不显示图片


4).BaseAdapter避免内存溢出

如果BaseAdapter的实体类有属性非常消耗内存,可以将保存到文件;为提高性能,可以进行缓存,并限制缓存大小。


3.使用线程池

分为核心线程池和普通线程池,下载图片等耗时任务放置在普通线程池,避免耗时任务阻塞线程池后,导致所有异步任务都必须等待

4.异步任务

分为核心任务和普通任务,只有核心任务中出现的系统级错误才会报错,异步任务的ui操作需要判断原activity是否处于激活状态

5.尽量避免static成员变量引用资源耗费过多的实例,比如Context

6.使用WeakReference代替强引用

弱引用可以让您保持对对象的引用,同时允许GC在必要时释放对象,回收内存。对于那些创建便宜但耗费大量内存的对象,即希望保持该对象,又要在应用程序需要时使用,同时希望GC必要时回收时,可以考虑使用弱引用。

7.超级大胖子Bitmap



8.保证Cursor 占用的内存被及时的释放掉,而不是等待GC来处理。

并且 Android明显是倾向于编程者手动的将Cursor close掉

9.线程也是造成内存泄露的一个重要的源头。

线程产生内存泄露的主要原因在于线程 生命周期的不可控

10.如果ImageView的图片是来自网络

进行异步加载

11.应用开发中自定义View

应用开发中自定义View的时候,交互部分,千万不要写成线程不断刷新界面显示,而是根据TouchListener事件主动触发界面的更新

12.Drawable



13.复用、回收Activity对象

临时的activity及时finish主界面设置为singleTask一般界面设置为singleTop

14.获取地理位置信息

位置信息获取用户的地理位置信息时,在需要获取数据的时候打开GPS,之后及时关闭掉

15.电源管理

在onResume时设置该界面的电源管理,在onPause时取消设置

16.android内存优化

android因其系统的特殊性,安装的软件默认都安装到内存中,所以随着用户安装的软件越来越多,可供运行的程序使用的内存越来越小,这就要求我们在开发android程序时,尽可能的少占用内存。根据我个人的开发经验总结了如下几点优化内存的方法:

  1. 创建或其他方式获得的对象如不再使用,则主动将其置为null。
  2. 尽量在程序中少使用对图片的放大或缩小或翻转.在对图片进行操作时占用的内存可能比图片本身要大一些。
  3. 尽可能的将一些静态的对象(尤其是集合对象),放于SQLite数据库中。并且对这些数据的搜索匹配尽可能使用sql语句进行。
  4. 一些连接资源在不使用使应该释放,如数据库连接文件输入输出流等。应该避免在特殊的情况下不释放(如异常或其他情况)
  5. 一些长周期的对像引用了短周期的对象,但是这些短周期的对象可能只在很小的范围内使用。所以在查内存中也应该清除这一隐患。
  6. 一个对象被多个对象引用,但是只释放了一处,也可能会导致这个对像不会被释放。



/Files/gaolei-xj/android如何提升性能.rar

文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。

原文链接:panda1234lee.blog.csdn.net/article/details/8678195

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。