Android APP中程序未响应出现的场景是哪些?如何避免?

匿名网友 匿名网友 发布于: 2016-09-20 00:00:00
阅读 215 收藏 0 点赞 0 评论 0

出现场景

  • 主线程被IO操作(从4.0之后网络IO不允许在主线程中)阻塞。
  • 主线程中存在耗时的计算
  • 主线程中错误的操作,比如Thread.wait或者Thread.sleep等

Android系统会监控程序的响应状况,一旦出现下面两种情况,则弹出ANR对话框

  • 应用在5秒内未响应用户的输入事件(如按键或者触摸)
  • BroadcastReceiver未在10秒内完成相关的处理

如何避免

基本的思路就是将IO操作在工作线程来处理,减少其他耗时操作和错误操作

  • 使用AsyncTask处理耗时IO操作。
  • 使用Thread或者HandlerThread时,调用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)设置优先级,否则仍然会降低程序响应,因为默认Thread的优先级和主线程相同。
  • 使用Handler处理工作线程结果,而不是使用Thread.wait()或者Thread.sleep()来阻塞主线程。
  • ActivityonCreateonResume回调中尽量避免耗时的代码
  • BroadcastReceiveronReceive代码也要尽量减少耗时,建议使用IntentService处理。

如何改善

通常100到200毫秒就会让人察觉程序反应慢,为了更加提升响应,可以使用下面的几种方法

  • 如果程序正在后台处理用户的输入,建议使用让用户得知进度,比如使用ProgressBar控件。
  • 程序启动时可以选择加上欢迎界面,避免让用户察觉卡顿。
  • 使用SystraceTraceView找出影响响应的问题。

如果开发机器上出现问题,我们可以通过查看/data/anr/traces.txt即可,最新的ANR信息在最开始部分。

评论列表
文章目录