了解ANR
以下内容翻译整理自官方文档: Keeping Your App Responsive
ANR 即 Application Not Responding。当App将在相当长的一段时间内无响应,系统将提供ANR提示给用户,使其可以退出App。
发生原因:
满足下列条件之一:
- 5秒内对输入事件无响应(如按键或屏幕点击)
- 一个BroadcastReceiver10秒内未执行完毕
怎样避免:
- 在UI线程中,尤其是关键生命周期函数,如OnCreate()或OnResume()中,做尽可能少的事情。有可能需要长时间运行的操作如网络或数据库操作,以及计算消耗大的任务比如bitmap操作,应该放在工作线程中。可以使用AsyncTask或者Thread or HandlerThread,并且通过Process.setThreadPriority()and passing THREAD_PRIORITY_BACKGROUND将其设置为后台线程。如果不降低线程优先级,那么它依然可能影响UI线程的响应。不要将UI线程阻塞去等待工作线程,而利用Handler机制。
- 由于明确的执行时间限制(10秒),在BroadcastReceiver中只能做小型而具体数量的后台工作。如果响应广播有耗时任务,应该使用IntentService。
- 可以使用StrictMode来监测是否有UI线程中的耗时操作。
怎样加强响应:
- 100 to 200ms是用户感受App响应是否迅速的阈值。
- 如果在进行耗时后台任务,显示其进度,比如使用ProgressBar。
- 使用Systrace and Traceview等工具检测影响响应的瓶颈。