Android 主线程卡顿统计

本文探讨了Android中主线程卡顿的问题,并提出了一种监控和优化方案。通过对Handler机制的深入剖析,采用MonitorThread来监测消息队列,实现对主线程任务耗时的有效监控。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:android卡顿问题始终是个悲伤的话题

目的:对整个Handler机制进行不同方面的的刨析

措施:首先Looper类,本身提供在消息处理前后会print相应消息。我们通过Looper的setMessageLogging方法进行监听,来记录每个主线程任务的运行耗时,超过一定时间,则上报。

问题:首先上面的非常简单有效,不过里面也存在一些问题,当在4.x手机上存在复杂列表时,上下快速滑动,会发现存在一定卡顿,帧率会掉10帧左右,控制台看到大量的GC日志输出,分析原因,追查代码可看到如下两段代码,存在大量的字符串拼接,快速被回收,造成频繁GC。


疑问:有没有一种这样的方法,尽量在主线程做最少的事情,并能够监测主线程的任务运行耗时?

优化方案:分析Handler,主要两部分组成,Looper,MessageQueue。Looper层面能做的就是上面的方法,MQ方面我们分析,

关键见识统计每一个消息的耗时,那么每个消失出队运行开始计时,超过指定时间就统计并且上报。

那么如果知道消息出队事件呢?我们尝试用另外一种方式侧面来知道。

我们生成一个监控线程。MonitorThread,简称MT,每过500ms监测一次队列首部是否存在我们插入特定消息,如果发现同一个消息存在超过5次,也就意味着超过2.5s,属于异常,则上报。

此方案由于缺乏足够的堆栈信息,主要应用与线上监测统计。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值