出现的原因

安卓的应用程序的应用场景要求它必须能够实时与用户交互,意味着它必须在应用程序关闭前能实时获取用户的输入并且给出反馈,所以它不能是一段能自己运行结束的代码,故它需要一个无限循环。

 

实现的机制

利用handler发送消息,如果消息队列没有消息则主线程进入等待状态,消息队列循环等待消息,当出现消息后唤醒主线程,处理消息对应的事件,处理完主线程继续等待下一个消息唤醒。

 

ANR

简介

如果有操作阻碍了UI线程,并持续了不短的时间,会导致后续可能出现的用户输入无法的到实时响应,会严重影响用户体验,所以直接弹出ANR弹框,询问用户继续等待还是结束当前应用。

出现的情况

  1. 用户输入未5s内未得到响应。
  2. contentProvider操作超过10s。
  3. 前台Broadcast超过10s或者后台Broadcast超过60s。
  4. 前台Service超过20s或者后台service超过200s。

 

主线程的无线循环为什么不触发

因为anr是触发的机制是在组件执行任务时发送延时消息触发,如果任务完成并且消息还没有发送,组件会去取消等待发送的消息,也就是说只要每次处理的事件不超时,anr就不会被触发。