Android面试准备:ANR浅析

参考博客:
http://blog.csdn.net/dadoneo/article/details/8270107

ANR:Application Not Responding(应用程序未响应)

  1. ANR现象
    如果手机应用程序在规定的时间里面没有及时响应的话,系统弹出一个ANR对话框,用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。
  2. ANR三种类型
    1、KeyDispatchTimeout(5 seconds) –最常见的ANR类型,按键或触摸事件在特定时间内无响应
    2、BroadcastTimeout(10 seconds)
    BroadcastReceiver在特定时间内无法处理完成
    3、ServiceTimeout(20 seconds) –小概率类型
    Service在特定的时间内无法处理完成
  3. KeyDispatchTimeout
    Akey or touch event was not dispatched within the specified time(按键或触摸事件在特定时间内无响应)
    具体的超时时间的定义在framework下的
    ActivityManagerService.java
    //How long we wait until we timeout on key dispatching.
    staticfinal int KEY_DISPATCHING_TIMEOUT = 5*1000
  4. 为什么会超时呢?
    超时时间的计数一般是从按键分发给app开始。超时的原因一般有两种:
    (1)当前的事件没有机会得到处理(即UI线程正在处理前一个事件,没有及时的完成或者looper被某种原因阻塞住了)
    (2)当前的事件正在处理,但没有及时完成
  5. 如何避免KeyDispatchTimeou
    1、主线程里面只负责与用户交互的工作
    2、一些耗时的工作任务(譬如说访问网络啊,IO操作啊)把它放入单独的线程处理(WorkerThread)
    3、尽量用Handler来处理UIthread和别的thread之间的交互
  6. UI线程
    说了那么多的UI线程,那么哪些属于UI线程呢?
    UI线程主要包括如下:
1Activity:onCreate(), onResume(), onDestroy(), nKeyDown(), onClick(),etc
2AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel,etc
3Mainthread handler: handleMessage(), post*(runnable r), etc
  1. ANR分析:从LOG可以看出ANR的类型
    (iowait?block?memoryleak?)
    1、CPU的使用情况,如果CPU使用量接近100%,说明当前设备很忙,有可能是CPU饥饿导致了ANR
    2、如果CPU使用量很少,说明主线程被BLOCK了/3、如果3、3、IOwait很高,说明ANR有可能是主线程在进行I/O操作造成的
    4、除了看LOG,解决ANR还得需要trace.txt文件,

总结:

  1. ANR,application not responding,应用程序未响应,它指的应用程序在规定的时间里面没有及时响应的话,系统弹出ANR这样一个对话框,用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。
  2. ANR一般有三种类型,最常见的是KeyDispatchTimeout(5 seconds) ,按键或触摸事件在特定时间内无法处理完成;另外两种比较少见的是BroadcastTimeout(10 seconds),Broadcast在特定时间内无法处理完成;ServiceTimeout(20 seconds),Service在特定的时间内无法处理完成。
  3. 产生这种超时的原因一般有两种,第一种的话是当前的事件没有机会得到处理(即UI线程正在处理前一个事件,没有及时的完成或者looper被某种原因阻塞住了),第二种的话是处理当前的事件没有及时完成。
  4. 如何避免ANR呢,在Android开发的过程中就要注意了,
    1:主线程里面呢尽量只做一些与用户交互的事情;
    2:那些耗时的工作,譬如说访问网络啊,I/O操作啊就应该放到workerThread里面
    3:然后用Handler来实现主线程和WorkerThread之间的消息的传递。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值