了解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等工具检测影响响应的瓶颈。

 

posted @ 2016-07-15 13:39  NoodleUtopia  阅读(199)  评论(0编辑  收藏  举报