android如何提升性能技巧(下)
1.什么是TraceView?
先看下百度出来的解释吧:
-
// start tracing to "/sdcard/yourActivityTrace.trace"
-
Debug.startMethodTracing("yourActivityTrace");
-
// ... stop tracing
-
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 <?xml version="1.0" encoding="utf-8"?>
-
2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-
3 package="com.himi"
-
4 android:versionCode="1"
-
5 android:versionName="1.0">
-
6 <application android:icon="@drawable/icon" android:label="@string/app_name">
-
7 <activity android:name=".MainActivity"
-
8 android:label="@string/app_name">
-
9 <intent-filter>
-
10 <action android:name="android.intent.action.MAIN" />
-
11 <category android:name="android.intent.category.LAUNCHER" />
-
12 </intent-filter>
-
13 </activity>
-
14 </application>
-
15 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
-
16 <uses-sdk android:minSdkVersion="4" />
-
17 </manifest>
3.运行项目并且退出项目从而得到的追踪文件,利用TraceView来进行分析代码运行状况:
-
18
-
22 public void hot(Canvas canvas) {
-
23 for (int i = 1; i < 100; i++) {
-
24 Bitmap bmp = BitmapFactory.decodeResource(getResources(),
-
25 R.drawable.icon);
-
26 canvas.drawBitmap(bmp, i += 2, i += 2, paint);
-
27 }
-
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
12.Drawable
13.复用、回收Activity对象
临时的activity及时finish主界面设置为singleTask一般界面设置为singleTop
14.获取地理位置信息
位置信息获取用户的地理位置信息时,在需要获取数据的时候打开GPS,之后及时关闭掉
15.电源管理
在onResume时设置该界面的电源管理,在onPause时取消设置
16.android内存优化
android因其系统的特殊性,安装的软件默认都安装到内存中,所以随着用户安装的软件越来越多,可供运行的程序使用的内存越来越小,这就要求我们在开发android程序时,尽可能的少占用内存。根据我个人的开发经验总结了如下几点优化内存的方法:
- 创建或其他方式获得的对象如不再使用,则主动将其置为null。
- 尽量在程序中少使用对图片的放大或缩小或翻转.在对图片进行操作时占用的内存可能比图片本身要大一些。
- 尽可能的将一些静态的对象(尤其是集合对象),放于SQLite数据库中。并且对这些数据的搜索匹配尽可能使用sql语句进行。
- 一些连接资源在不使用使应该释放,如数据库连接文件输入输出流等。应该避免在特殊的情况下不释放(如异常或其他情况)
- 一些长周期的对像引用了短周期的对象,但是这些短周期的对象可能只在很小的范围内使用。所以在查内存中也应该清除这一隐患。
- 一个对象被多个对象引用,但是只释放了一处,也可能会导致这个对像不会被释放。
/Files/gaolei-xj/android如何提升性能.rar
文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。
原文链接:panda1234lee.blog.csdn.net/article/details/8678195
- 点赞
- 收藏
- 关注作者
评论(0)