卡顿优化之ANR分析与实战

241 篇文章 5 订阅

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、

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值