码迷,mamicode.com
首页 > 移动开发 > 详细

Android性能优化

时间:2016-05-12 12:08:27      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:

性能优化:布局优化、绘制优化、内存泄漏优化、响应速度优化、ListView优化、Bitmap优化、线程优化等
1.布局优化
思想:尽量减少布局的层级,绘制工作量少,性能高
操作:1.删除布局中无用的控件和层级
           2. 选择使用性能低的ViewGroup,比如LinearLayout、FrameLayout,RelativeLayout功能复杂,优先使用前两者
           3.采用<include>标签、<merge>标签和ViewStub。
<include>标签主要用于布局重用,<merge>标签一般和<include>标签配合使用,它可以降低减少布局的层级
ViewStub提供了按需加载的功能,继承了View,非常轻量级且宽高都是0,本身不参加任何的布局和绘制过程。

2.绘制优化
思想:绘制优化是指View的onDraw方法要避免执行大量的操作。
操作:1.onDraw中不要创建新的局部对象,这是因为onDraw方法可能会被频繁调用,这样就会在一瞬间产生大量的临时对象,这不仅仅占用了过多的内存而且还会导致系统更加频繁GC,降低了程序的执行效率。
           2.onDraw方法中不要做耗时的任务,也不能执行成千上万次的循环操作。

3.内存泄露优化
1.避免写出有内存泄漏的代码
2.通过一些分析工具比如MAT来找出潜在的内存泄漏继而解决。
出现场景:
1.静态变量导致的内存泄漏
2.单例模式导致的内存泄漏
3.属性动画导致内存泄漏:android3.0之后的属性动画,无限循环播放需要在onDestroy中调用animator.cancel()停止动画
Android内存泄漏:
1.资源对象没关闭造成的内存泄漏
2.构造Adapter时,没有使用缓存的convertView
3.Bitmap对象不在使用时调用recycle()释放内存
4.试着使用关于application的context来替代和activity相关的context
5.注册没取消造成的内存泄漏
6.集合中对象没清理造成的内存泄漏


4.响应速度优化与ANR日志分析
响应速度优化的核心思想是避免在主线程中做耗时操作,采用异步的方式执行耗时操作。
比如在主线程中做了非常耗时的操作,比如说是下载,io异常等
  潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程里(或者以数据库操作为例,通过异步请求的方式)来完成

Activity如果5 s之内无法响应屏幕触摸事件或者键盘输入事件,就会出现ANR
broadcastReceiver 10s之内还没执行完操作就会出现ANR

当一个进程发生ANR之后,系统会在/data/anr目录下创建了一个文件traces.txt


第二:如何避免ANR?
1、运行在主线程里的任何方法都尽可能少做事情。特别是,Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做创建操作。(可以采用重新开启子线程的方式,然后使用Handler+Message的方式做一些操作,比如更新主线程中的ui等

2、应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。但不再是在子线程里做这些任务(因为 BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个 Service。(此处需要注意的是可以在广播接受者中启动Service,但是却不可以在Service中启动broadcasereciver,关于原因后续会有介绍,此处不是本文重点)

3、避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广 播时需要向用户展示什么,你应该使用Notification Manager来实现

总结:anr异常也是在程序中自己经常遇到的问题,主要的解决办法自己最常用的就是不要在主线程中做耗时的操作,而应放在子线程中来实现,比如采用Handler+mesage的方式,或者是有时候需要做一些和网络相互交互的耗时操作就采用asyntask异步任务的方式(它的底层其实Handler+mesage有所区别的是它是线程池)等,在主线程中更新UI。

5.ListView和Bitmap优化
ListView优化:
首先采用ViewHolder并避免在getView中执行耗时操作
其次根据列表的滑动状态来控制任务的执行频率
最后可以尝试开启硬件加速来使ListView的滑动更加流畅

Bitmap优化:主要通过BitmapFactory.Options来根据需要对图片进行采样。

6.线程优化
采用线程池,避免程序中存在大量的Thread

7.一些性能优化建议
避免创建过多的对象
不要过多使用枚举,枚举占用的内存空间要比整型大
常量使用static final来修饰
使用一些Android特有的数据 结构,比如SparseArray和Pair等,他们有更好的性能。
适当使用软引用和弱饮用
采用内存缓存和磁盘缓存
尽量采用静态内部类,这样可以避免潜在的由于内部类而导致的内存泄漏

内存泄露分析之MAT工具
分析泄露问题

Android性能优化

标签:

原文地址:http://blog.csdn.net/u010980446/article/details/51372525

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!