1. ANR定义:Application Not Responding--应用无响应
2.ANR的类型:
(2) BroadcastTimeout(10 seconds) --BroadcastReceiver在10秒内无法处理完成
(3) ServiceTimeout(20 seconds) --小概率类型Service在20秒内无法处理完成
3.ANR的原因:
(2)当前的事件正在处理,但没有及时完成
4.如何避免
(1) UI线程尽量只做跟UI相关的工作,数据提取在work thread中做,尽可能多的减轻UI线程的工作(耗时的工作(比如数据库操作,I/O,连接网络或者别的有可能阻碍UI线程的操作)把它放入单独的线程处理)
(2) 尽量用Handler来处理UIthread和work thread之间的交互,或者用AsyncTask
(1) BroadcastReceiver适合处理小的,分散的工作,例如保存设置或者注册消息通知等;耗时的操作提交到IntentService处理
注意:不能使用子线程处理(因为 BroadcastReceiver 的生命周期很短 , 子线程可能还没有结束 BroadcastReceiver 就先结束了 .BroadcastReceiver 一旦结束 , 此时 BroadcastReceiver所在进程很容易在系统需要内存时被优先杀死 , 因为它属于空进程 ( 没有任何活动组件的进程 ). 如果它的宿主进程被杀死 , 那么正在工作的子线程也会被杀死 . 所以采用子线程来解决是不可靠的)
(1) 同KeyDispatchTimeout
5.UI线程包括
(2) AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel,etc
(3) Mainthread handler: handleMessage(), post*(runnable r), etc
(4) other
6. ANR问题分析
(1) 分析log
(2) 从traces.txt文件查看调用stack(主要看main线程).
(3) 看代码:定位触发anr的代码
(4) 查看ANR的成因(iowait?block?memoryleak?)
7. 相关编码原则(提高系统响应性)
(2) 多使用本地方法
(3) 使用实现类(视情况而定):Map myMap1 = new HashMap(); ==》 HashMap myMap2 = new HashMap();
(4) 不用getter和setter()
(5) 将成员变量缓存到本地(访问成员变量比访问本地变量慢)
(6) 使用常量(编译器会直接替换)
(7) 避免使用枚举
(8) 避免使用浮点数