背景:android卡顿问题始终是个悲伤的话题
目的:对整个Handler机制进行不同方面的的刨析
措施:首先Looper类,本身提供在消息处理前后会print相应消息。我们通过Looper的setMessageLogging方法进行监听,来记录每个主线程任务的运行耗时,超过一定时间,则上报。
问题:首先上面的非常简单有效,不过里面也存在一些问题,当在4.x手机上存在复杂列表时,上下快速滑动,会发现存在一定卡顿,帧率会掉10帧左右,控制台看到大量的GC日志输出,分析原因,追查代码可看到如下两段代码,存在大量的字符串拼接,快速被回收,造成频繁GC。
疑问:有没有一种这样的方法,尽量在主线程做最少的事情,并能够监测主线程的任务运行耗时?
优化方案:分析Handler,主要两部分组成,Looper,MessageQueue。Looper层面能做的就是上面的方法,MQ方面我们分析,
关键见识统计每一个消息的耗时,那么每个消失出队运行开始计时,超过指定时间就统计并且上报。
那么如果知道消息出队事件呢?我们尝试用另外一种方式侧面来知道。
我们生成一个监控线程。MonitorThread,简称MT,每过500ms监测一次队列首部是否存在我们插入特定消息,如果发现同一个消息存在超过5次,也就意味着超过2.5s,属于异常,则上报。
此方案由于缺乏足够的堆栈信息,主要应用与线上监测统计。