在 Looper#loop()
方法。
1 | public static void loop() { |
这个 Printer
日志给我打印了主线程分发消息之前打印一个日志,分发完成之后又打印一条日志,分别是:
1 | Dispatching to + 目标Handler + msg.what; |
我们知道这个在应用程序启动的入口 ActivityThread#main
方法,初始化了主线程的 Looper
. 同时也有一个 Handler H
, Activity
的生命周期就是通过向 H
发送消息来完成的。
Android
是消息驱动的,这大概就是这个意思吧。如果我们可以得知主线程每个message
的消耗时间,可以间接用来分析每个方法的耗时,从而进行一个优化工作,可以给主线程的Looper
设置一个Printer
, 如下:
1 | Looper.myLooper().setMessageLogging(new Printer() { |
如果有另外一条线程,记录我们执行前的堆栈信息,同时记录每次 dispatchMessage
方法耗时,算出二者之差,当超过某个时间的时候,认为该方法耗时过长,需要进行优化。到这里你可能想到了 BlockCannary
是的它基本上就是利用了这个原理,来分析优化的。