1、
2、
3、
4、
5、
6、
ANR WatchDag只有两个类,一个是ANR Error,一个是ANRWatchDog。ANRWatchDog继承自Thread,实际上它是一个线程。对于线程来说,最主要的就是run()方法。在run()方法中,首先对线程进行了一次命名,接下来声明了一个变量,也就是lastTick,然后进行while循环,在while循环中通过_uiHandler post出一个runnable
这个runnable做的事情就是进行+1的操作,接下来这个线程就会sleep一段时间。sleep一段时间后就开始来检测,检测刚刚post出去的runnable有没有被执行。依据就是刚刚的+1操作有没有被执行。如果刚刚的+1操作成功了,那么就说明runnable被执行了,也就是ui线程没有发生卡顿。如果说刚刚那个值没有发生变化,也就是没有+1成功,那就说明当前这个MainThread已经处于卡顿状态,导致runnable没有办法被执行。
如果这两个值是一样的,说明很有可能发生了ANR,封装一个ANRError
拿到MainThread主线程,然后通过主线程拿到堆栈信息,然后返回要给ANRError,然后通过_anrListener调用它的onAppNotResponding(error)这样一个回调方法。
默认处理就是将error throw出去,也就是程序会崩溃
运行后程序崩溃,可以看到堆栈信息
可以自定义listener,收到堆栈信息后上报到服务器进行分析。
7、
8、
9、
Android PerformanceMonitor:监控Msg的执行,会在主线程每个Msg执行的前后打一个时间戳,计算一下每一个Message具体的执行时间,一般来说每个msg的执行时间是非常短暂的,也就是达不到ANR这个级别。
ANR -WatchDog是不管前面是怎么执行的,只管最终的执行过程,sleep一段时间后就看该值有没有被修改过。如果没有被改过,就说明没有发生ANR,如果没有被修改,就断定发生了ANR。
10、