Android性能优化
Android 性能优化的方法
性能问题一般分为3类
- UI卡顿
- 内存问题
- 耗电问题
布局优化
尽量减少布局文件的层级,减少Android绘制时的工作量
- 删除布局中无用的控件和层级
- 有选择的使用性能较低的
ViewGroup
,比如RelativeLayout
- 使用
<include>
,<merge>
标签和ViewStub
ViewStub: 非常轻量级,宽高都为0,它本身不参与任何的布局和绘制过程。它的意义在于按需加载所需的布局文件。
绘制优化
避免在
View
的onDraw
方法中执行大量操作,不要在其中创建新的局部对象,不要执行耗时操作
内存泄漏优化
-
内存泄漏的场景
-
静态变量导致内存泄漏,例如静态变量引用
Activity
导致Activity无法销毁造成内存泄漏 -
单例模式导致内存泄漏,单例的静态特性导致其生命周期同应用一样长
解决方案:
1. 将该属性的应用方式改为弱引用WeakReference
2. 如果传入Context
,使用ApplicationContext
-
属性动画导致内存泄漏,记得在Activity的
onDestroy
方法中停止动画执行 -
Handler导致的内存泄漏,当Handler有延时任务或者消息队列等待的时间长,若Handler持有其他对象的引用,就会导致内存泄漏
-
注册监听器导致内存泄漏,一定记得解除注册
-
Cursor,Stream没有close,View没有recyle导致内存泄漏
-
-
内存泄漏分析可以使用
leakcanary
或者MAT
ANR
日志分析
Android 规定如果一个程序在5秒钟之内无法响应屏幕触摸事件或者键盘输入事件就会出现ANR.
这个时候系统就会在应用的 /data/anr
目录下创建一个traces.txt
文件,一些关于ANR的报错日志都会在这个文件当中,利于分析原因
Bitmap优化
主要是通过BitmapFactory.Options来根据需要对图片进行采样
线程的优化
采用线程池,线程池里面会重用线程,从而避免线程的创建和销毁带来性能的消耗,同时线程池还能有效的控制线程的最大并发数,避免大量的线程应为互相抢占资源导致线程阻塞现象的发生。
一些性能优化的建议
- 避免创建过多的对象
- 不要过多的使用枚举,枚举占用的内存空间比整型大
- 常量要使用 static final 修饰
- 使用Android特有的一些数据结构,比如SparseArray和ArrayMap等,他们都具有更好的性能
- 适当的使用软引用和弱引用
- 采用内存缓存和磁盘缓存
- 尽量采用静态内部类可以避免潜在的由于内部类而导致的内存泄漏
* 非静态内部类和匿名类都会潜在的引用他们所属的外部类,但是静态内部类却不会,如果这个非静态内部类实例做了一些耗时操作,那么就会造成外围对象不会被回收,从而导致内存泄漏。 - 耗电量优化建议:不要影响手机进入休眠,不要频繁唤醒手机,正确使用
Alarm
网友评论