1、

卡顿优化之ANR分析与实战

2、

卡顿优化之ANR分析与实战

3、

卡顿优化之ANR分析与实战

4、

卡顿优化之ANR分析与实战

5、

卡顿优化之ANR分析与实战

6、

卡顿优化之ANR分析与实战

ANR WatchDag只有两个类,一个是ANR Error,一个是ANRWatchDog。ANRWatchDog继承自Thread,实际上它是一个线程。对于线程来说,最主要的就是run()方法。在run()方法中,首先对线程进行了一次命名,接下来声明了一个变量,也就是lastTick,然后进行while循环,在while循环中通过_uiHandler post出一个runnable

卡顿优化之ANR分析与实战

 

这个runnable做的事情就是进行+1的操作,接下来这个线程就会sleep一段时间。sleep一段时间后就开始来检测,检测刚刚post出去的runnable有没有被执行。依据就是刚刚的+1操作有没有被执行。如果刚刚的+1操作成功了,那么就说明runnable被执行了,也就是ui线程没有发生卡顿。如果说刚刚那个值没有发生变化,也就是没有+1成功,那就说明当前这个MainThread已经处于卡顿状态,导致runnable没有办法被执行。

卡顿优化之ANR分析与实战

 

如果这两个值是一样的,说明很有可能发生了ANR,封装一个ANRError

卡顿优化之ANR分析与实战

 

拿到MainThread主线程,然后通过主线程拿到堆栈信息,然后返回要给ANRError,然后通过_anrListener调用它的onAppNotResponding(error)这样一个回调方法。

卡顿优化之ANR分析与实战

 

 

默认处理就是将error throw出去,也就是程序会崩溃

卡顿优化之ANR分析与实战

 

运行后程序崩溃,可以看到堆栈信息

卡顿优化之ANR分析与实战

 

可以自定义listener,收到堆栈信息后上报到服务器进行分析。

7、

卡顿优化之ANR分析与实战

8、

卡顿优化之ANR分析与实战

9、

Android PerformanceMonitor:监控Msg的执行,会在主线程每个Msg执行的前后打一个时间戳,计算一下每一个Message具体的执行时间,一般来说每个msg的执行时间是非常短暂的,也就是达不到ANR这个级别。

ANR -WatchDog是不管前面是怎么执行的,只管最终的执行过程,sleep一段时间后就看该值有没有被修改过。如果没有被改过,就说明没有发生ANR,如果没有被修改,就断定发生了ANR。

卡顿优化之ANR分析与实战

10、

卡顿优化之ANR分析与实战

相关文章:

  • 2021-08-21
  • 2021-08-25
  • 2021-05-27
  • 2021-05-23
  • 2021-11-13
  • 2022-12-23
  • 2021-07-30
  • 2021-11-27
猜你喜欢
  • 2021-08-02
  • 2021-09-04
  • 2022-12-23
  • 2021-10-17
  • 2021-09-12
  • 2021-11-27
  • 2021-09-28
相关资源
相似解决方案