【面试题】子线程中创建的handler 为什么一定要调用 Loo
2019-01-23 本文已影响0人
小浩_w
Handler处理消息的过程如下:
首先,检查Message的callback是否为null,不为null就通过handleCallback来处理消息。Message的callback是一个Runnable对象,实际上就是Handler的post方法所传递的Runnable参数。handleCallback的逻辑也是很简单,如下:
private static void handleCallback(Message message) {
message.callback.run();
}
其次,检查mCallback是否为null,不为null就调用mCallback的handleMessage方法来处理消息。Callback是个接口,它的定义如下:
![](https://img.haomeiwen.com/i3950001/a3b6e4cbca49d5e7.png)
Handler还有一个特殊的构造方法,可以指定一个特殊的Looper来构造Handler。
![](https://img.haomeiwen.com/i3950001/a88702bb6bc6b4c3.png)
Handler创建需要Looper,否则会抛出异常,默认获取当前线程的Looper。主线程也就是ActivityThread会自动创建Looper,其他线程如果需要Looper均需要手动创建。
主线程不用手动创建,因为已经自动创建Looper了