什么是 ANR?ANR:application Not Responding,即应用无响应
ANR一般有三种类型:
KeyDispatchTimeout(5 seconds) –主要类型按键或触摸事件在特定时间内无响应BroadcastTimeout(10 seconds) –BroadcastReceiver在特定时间内无法处理完成ServiceTimeout(20 seconds) –小概率类型 Service在特定的时间内无法处理完成KeyDispatchTimeoutAkey or touch event was not dispatched within the specified time(按键或触摸事件在特定时间内无响应)具体的超时时间的定义在framework下的ActivityManagerService.java
//How long we wait until we timeout on key dispatching. static final int KEY_DISPATCHING_TIMEOUT = 5*1000超时时间的计数一般是从按键分发给app开始。超时的原因一般有两种:(1)当前的事件没有机会得到处理(即UI线程正在处理前一个事件,没有及时的完成或者looper被某种原因阻塞住了)(2)当前的事件正在处理,但没有及时完成
一些避免 ANRs 的技巧
建议使用 AsycnTask 来异步处理后台数据相比起 AsycnTask 来说,创建自己的线程或者 HandlerThread 稍微复杂一点。如果你想这样做,你应该通过 PRocess.setThreadPriority() 并传递 THREAD_PRIORITY_BACKGROUND 来设置线程的优先级为”background”。如果你的程序需要响应正在后台加载的任务,在你的 UI 中可以显示 ProgressBar 来显示进度。对游戏程序,在工作线程执行计算的任务。如果你的程序在启动阶段有一个耗时的初始化操作,可以考虑显示一个闪屏,要么尽快的显示主界面,然后马上显示一个加载的对话框,异步加载数据。无论哪种情况,你都应该显示一个进度信息,以免用户感觉程序有卡顿的情况。使用性能测试工具,例如 Systrace 与 Traceview 来判断程序中影响响应性的瓶颈。参考自Android ANR 分析解决方法官方文档(中文版)
新闻热点
疑难解答