每日一道面试题(第8期)---ANR出现的场景以及解决方案

零零碎碎的东西老是记不长久,仅仅学习别人的文章也只是他人咀嚼后留下的残渣。无心中发现了这个每日一道面试题,想了想若是只是简单地去思考,那么不只会收效甚微,甚至难一点的题目本身可能都懒得去想,坚持不下来。因此不如把每一次的思考、理解以及别人的看法记录下来。不只加深本身的理解,更要激励本身坚持下去。git

ANR: application not response,应用程序没有响应。Android应用程序基于消息处理机制保证在发生输入、触摸等须要响应的事件以后,在规定的时间内没有获得有效的响应或者响应时间过长,都会发生ANR,弹出ANR对话框---等待应用或者退出应用。github

Android中的响应性事件处理受到Activity Manager Service、Window Manager Service这两个系统服务的监视,全部与ANR相关的消息,都通过系统进程(system_service)的调度,而后分发给应用进程进行实际的消息处理。系统进程经过系统服务的监视,根据不一样的状况限制不一样的超时时长,一旦在限制的时间内得不到响应,就会调用AppNotRespondingDialog.show()显示ANR对话框。面试

实际上,Android的主线程,也就是用来绘制View的UI线程,是线程不安全的,因此就使用ANR原则对主线程进行限制,保证主线程在串行处理事件时保持流畅性,给用户良好的体验(好比UI的绘制工做必须在16ms内完成)。因此在主线程中的全部耗时操做(密集型cup操做、网络请求、大量IO等),都有可能发生ANR。安全

Android四大组件Activity、Service、BroadcastReceiver、ContentProvider都是运行在主线程中,对此定义不一样的标准限制它们的响应时长:网络

  • Service TimeOut:Service:前台Service(通知栏有显示)20s内、后台Service200s内
  • BroadcastQueue TimeOut:BroadcastReceiver中,前台广播10s,后台广播60s。
  • ContentProvider TimeOut:在publish中超过10s
  • InputDispatching TimeOut:键盘输入事件、触摸事件5s内得不到响应

ANR监测机制: 总体的一个大体流程就是---事件开始前进行计时->进行事件处理->事件处理完,限制时间没到,移除计时,系统正常进行。事件没处理完,限制时间已到,移除计时,弹出ANR对话框多线程

发生事件处理超时的状况有两种:app

  • 当前事件没有机会获得处理,主线程正在响应另外的时间,当前事件被阻塞
  • 当前事件正在处理,但处理事件过长致使长时间得不到响应

ANR预防: 耗时操做在尽可能子线程中操做---AsyncTask、intentService、HandlerThread,多线程操做避免死锁的出现以及快速的解决办法,还有就是UI层次的复杂绘制,尽可能减小布局嵌套,若是Activity初始化须要必定的耗时,能够考虑立刻显示Activity显示Dialog加载框异步加载数据。异步

相关文章
相关标签/搜索