Android ANR问题总结

1. ANR定义:Application Not Responding--应用无响应


2.ANR的类型:


  (1) KeyDispatchTimeout(5 seconds) --按键或触摸事件在5秒内无响应
  (2) BroadcastTimeout(10 seconds) --BroadcastReceiver在10秒内无法处理完成

  (3) ServiceTimeout(20 seconds) --小概率类型Service在20秒内无法处理完成


3.ANR的原因:


  (1)当前的事件没有机会得到处理(即UI线程正在处理前一个事件,没有及时的完成或者looper被某种原因阻塞住了)

  (2)当前的事件正在处理,但没有及时完成


4.如何避免


  a.KeyDispatchTimeout

     (1) UI线程尽量只做跟UI相关的工作,数据提取在work thread中做,尽可能多的减轻UI线程的工作(耗时的工作(比如数据库操作,I/O,连接网络或者别的有可能阻碍UI线程的操作)把它放入单独的线程处理)

     (2) 尽量用Handler来处理UIthread和work thread之间的交互,或者用AsyncTask


  b.BroadcastTimeout
     (1) BroadcastReceiver适合处理小的,分散的工作,例如保存设置或者注册消息通知等;耗时的操作提交到IntentService处理

     注意:不能使用子线程处理(因为 BroadcastReceiver 的生命周期很短 , 子线程可能还没有结束 BroadcastReceiver 就先结束了 .BroadcastReceiver 一旦结束 , 此时 BroadcastReceiver所在进程很容易在系统需要内存时被优先杀死 , 因为它属于空进程 ( 没有任何活动组件的进程 ). 如果它的宿主进程被杀死 , 那么正在工作的子线程也会被杀死 . 所以采用子线程来解决是不可靠的)


  c.KeyDispatchTimeout

     (1) 同KeyDispatchTimeout


5.UI线程包括


  (1) ActivitynCreate(), onResume(), onDestroy(), onKeyDown(), onClick(),etc
  (2) AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel,etc
  (3) Mainthread handler: handleMessage(), post*(runnable r), etc

  (4) other


6. ANR问题分析


   从LOG可以看出ANR的类型,CPU的使用情况,如果CPU使用量接近100%,说明当前设备很忙,有可能是CPU饥饿导致了ANR如果CPU使用量很少,说明主线程被BLOCK了如果IOwait很高,说明ANR有可能是主线程在进行I/O操作造成的
   (1) 分析log
   (2) 从traces.txt文件查看调用stack(主要看main线程).
   (3) 看代码:定位触发anr的代码

   (4) 查看ANR的成因(iowait?block?memoryleak?)


7. 相关编码原则(提高系统响应性)


   (1) 避免建立对象并且尽量使用原始数据类型(int,byte等):如字符串连接使用StringBuffer等
   (2) 多使用本地方法
   (3) 使用实现类(视情况而定):Map myMap1 = new HashMap(); ==》 HashMap myMap2 = new HashMap();
   (4) 不用getter和setter()
   (5) 将成员变量缓存到本地(访问成员变量比访问本地变量慢)
   (6) 使用常量(编译器会直接替换)
   (7) 避免使用枚举

   (8) 避免使用浮点数



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值