前言
IdleHandler是Android系统为开发者提供的一种在消息队列空闲时运行任务的机制,通过IdleHandler执行的任务优先级低于主线程优先级,会在主线程任务执行完成后再执行,所以适用于一些实时性要求不高的任务,通常用于Android启动优化中,将一些优先级较低的任务延后执行,以提高应用启动速度。看下消息队列中的源码。
@UnsupportedAppUsage
Message next() {
//前边省略了很多代码,只有消息队列当前没有需要执行的任务时,才会执行到下边的代码
for (int i = 0; i < pendingIdleHandlerCount; i++) {
final IdleHandler idler = mPendingIdleHandlers[i];
keep = idler.queueIdle();
}
}
那么既然IdleHandler是用于进行性能优化的,为什么matrix还要对其进行监控呢?从上边的分析我们可以知道,IdleHandler也是在主线程消息队列中运行的,所以假如IdleHandler中出现了耗时任务执行,那么很明显就会导致主线程卡顿,IdleHandler也是属于主线程卡顿监控的关键一环。
了解了IdleHandler监控的必要性,我们现在开始今天的源码分析。和其他类型的tracer一致,IdleHandler也是在TracePlugin中进行初始化和调用的,那么我们就从这几个关键方法入手:
- 构造方法
- onStartTrace
- onStopTrace
构造方法
构造方法仅仅是拿到了传入的配置,配置中包含的是IdleHandler监控是否启用的开关,isIdleHandlerTraceEnable。
public IdleHandlerLagTracer(TraceConfig config) {
traceConfig = config;
}
onStartTrace
onStartTrace会调用到onAlive方法,我们看onAlive的源码,首先初始化了一个HandlerThread,然后创建了一个IdleHandlerLagRunnable,最后调用了detectIdleHandler开启监控。
@Override
public void onAlive() {
super.onAlive();
if (traceConfig.isIdleHandlerTraceEnable()) {
//异步线程
idleHandlerLagHandlerThread = new HandlerThread("IdleHandlerLagThread");
//上报信息用的runnable
idleHandlerLagRunnable = new IdleHandlerLagRunable();
detectIdleHandler();
}
}
IdleHandlerLagRunnable是用于上报信息

本文围绕Android的IdleHandler展开,它用于在消息队列空闲时执行低优先级任务,可用于启动优化。但其中的耗时任务会导致主线程卡顿,因此matrix对其进行监控。文章从构造方法、onStartTrace、onStopTrace等关键方法入手,分析了IdleHandlerLagTracer的实现逻辑,以发现卡顿问题。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



