一:什么是ANR
如果应用程序不能响应用户的输入了,那么就可以说应用ANR了。
如果需要运行一个耗时较长的操作的时候,不要把这个任务放在UI线程上运行,而是单独创建一个线程运行那些操作。
以下情况会出现ANR提示对话框:(1). 5秒内对一个输入动作没有反应。 (2). 一个BroadcastReceiver在10秒内没有完成运行。
二:如何避免ANR
在activity的关键的生命周期方法: onCreate 和 onResume方法上尽可能处理越少越好的事情。
下面列举的操作都是长时间运行的:网络工作、数据库操作、精确的计算,例如重新定制图片(应该在单独的工作线程中)、或者通过异步请求操作数据库的情况下。
最有效的创建一个工作线程来执行长时间操作的是Asynctask类。如果你非要自己创建一个自己的Thread或者HandlerThread类,你应该设置这个类的属性为"background",通过调用Process.setThreadPriority() ,填上THREAD_PRIORITY_BACKGROUND参数。如果你不设置低优先级,那么你的线程仍然有可能减慢你的应用,因为它默认运行的优先级和你的UI线程的优先级一样。当你实现Thread或HandlerThread方法的时候,确定你的UI线程不会在等待工作线程结束的过程中被阻塞,不要调用Thread.wait()或者 Thread.sleep()。你的应用主线程不应该因为等待子线程完成而阻塞,而是应该提供一个Handler去接受其他线程完成后的结果。这样设计你的应用可以保证你的应用仍然能够响应用户的输入,避免ANR。
接受BroadcastReciver的执行时间,约束它的执行时间,主要进行的操作是保存设置或者注册一个通知,这样的话,才能够避免当其他方法调用UI线程的时候,应用程序在执行长耗时的方法。
如果非要在接收Broadcast后执行长时间的操作,可以启动一个IntentService来执行。