平台:Android4.4.2
虽然ANR的缩写是application not responding,但是并不是所有的ANR问题都是应用程序的问题。比如说CPU占用率太高、API调用卡死都有可能导致ANR,这些问题都是系统性问题。
1. 什么是ANR?
Android应用程序和Windows应用程序一样,采用的也是消息循环模型。就是说应用程序启动后在没有主动创建线程的情况下就只有一个主线程不断的从消息队列取出消息然后处理消息。
目前Android共定义了三种ANR,第一种比较容易理解,就是用户按键或滑动触屏后,应用程序在规定时间内不响应(当前默认值是5秒),从用户的角度看,这个问题是非常严重的,不要说5秒,只要超过1秒不响应其实都是不可接受的。识别这种ANR的原理是通过运行在system_server进程中的InputDispatcher不断检测应用程序是否处理完这个输入事件,一旦超时就打小报告,如弹出应用程序无响应的对话框,产生ANR日志。
另外两种ANR带有预防性质,因为主线程既要响应用户输入又要干其他事情,如果其他事情干的太慢那么就有可能影响对用户的响应。如果这个时候用户没有输入,那么也就算了,如果用户一旦有输入,那么必然产生前一种ANR。针对这种ANR只是产生ANR日志,但不弹框。现在说这两种ANR是什么,一种是主线程在处理通知的onReceive函数中执行超过10秒没有返回,另外一种是主线程在执行后台操作即执行Service的各个生命周期函数超过20秒。
如果主线程仅处理用户响应,其他的事情都通过另外一个线程处理那么是不是就没有ANR了呢?我想这样会好一些,因为有些程序员不太清楚哪些事情在主线程干的