anr
anr就是一个应用程序无响应的对话框.在主线程中做了耗时操作.
- 应用在5秒内未响应用户的输入事件,如按键或触摸事件
- BroadcastReceiver未在10秒内完成相关的处理
- Service的各个生命周期函数时20秒内没有执行完毕
1. 原因:
- 主线程中IO操作(4.0后网络IO不允许在主线程中)阻塞
- 主线程中存在耗时的计算
2. 造成anr主要原因在Android中那些操作是在主线程的
- activity的所有生命周期回调都是执行在主线程的.
- service默认是执行在主线程的.(改用IntentService)
- BroadcastReceiver的onReceive回调是执行在主线程的.
- 没有使用子线程的looper的handler的handlemessage,post(runnable)是执行在主线程的.
- AsyncTask的回调除了doinbackground,其他都是执行在主线程的.
3. 解决anr
- 使用asynctask处理耗时io操作
- 使用thread或者handlerThread提高优先级(handlerThread子线程中可以创建handler来发送消息)
- 使用handler来处理工作线程的耗时任务
- activity的oncreate和onresume回调中尽量避免耗时操作
oom
当前占用的内存加上我们申请的内存资源超过了dalvik虚拟机的最大内存限制就会抛出oom异常.
1. 容易混淆的概念
内存溢出oom
内存抖动
短时间内大量的对象被创建,又被大量的释放.
内存泄漏
进程中的对象没有使用,但是引用到了没有被回收的对象,导致这些对象不能被回收.
2. 解决oom
bitmap优化
- 优化图片显示
- 及时释放内存
- 图片压缩
- inBitmap属性
- 捕获异常
其他
- listview: convertview/lru
- 避免在ondraw执行对象的创建
- 谨慎使用多进程