Handler中的Printer

Looper#loop() 方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public static void loop() {
final Looper me = myLooper();//这里主线程的Looper
...xxx
for (;;) {
Message msg = queue.next(); // might block
if (msg == null) {
// No message indicates that the message queue is quitting.
return;
}

// This must be in a local variable, in case a UI event sets the logger
//给 UI 事件设置一个日志
final Printer logging = me.mLogging;
if (logging != null) {
logging.println(">>>>> Dispatching to " + msg.target + " " +
msg.callback + ": " + msg.what);
}
...xx
try {
//线程分发消息给Handler
//msg.target 指的是 Handler
msg.target.dispatchMessage(msg);
dispatchEnd = needEndTime ? SystemClock.uptimeMillis() : 0;
} finally {
....xx
}
....xx
if (logging != null) {
logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);
}
....xx
}
}

这个 Printer 日志给我打印了主线程分发消息之前打印一个日志,分发完成之后又打印一条日志,分别是:

1
2
3
Dispatching to + 目标Handler + msg.what;

Finished to + 目标Handler,分发完成

我们知道这个在应用程序启动的入口 ActivityThread#main 方法,初始化了主线程的 Looper . 同时也有一个 Handler H , Activity 的生命周期就是通过向 H 发送消息来完成的。

Android 是消息驱动的,这大概就是这个意思吧。如果我们可以得知主线程每个message的消耗时间,可以间接用来分析每个方法的耗时,从而进行一个优化工作,可以给主线程的Looper 设置一个Printer, 如下:

1
2
3
4
5
6
Looper.myLooper().setMessageLogging(new Printer() {
@Override
public void println(String x) {
xxx...
}
});

如果有另外一条线程,记录我们执行前的堆栈信息,同时记录每次 dispatchMessage 方法耗时,算出二者之差,当超过某个时间的时候,认为该方法耗时过长,需要进行优化。到这里你可能想到了 BlockCannary 是的它基本上就是利用了这个原理,来分析优化的。

-------------本文结束感谢您的阅读-------------