【面试题】子线程中创建的handler 为什么一定要调用 Looper.prepare()?主线程呢?

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是个接口,它的定义如下:

image.png

Handler还有一个特殊的构造方法,可以指定一个特殊的Looper来构造Handler。

image.png

Handler创建需要Looper,否则会抛出异常,默认获取当前线程的Looper。主线程也就是ActivityThread会自动创建Looper,其他线程如果需要Looper均需要手动创建。

主线程不用手动创建,因为已经自动创建Looper了

你可能感兴趣的:(【面试题】子线程中创建的handler 为什么一定要调用 Looper.prepare()?主线程呢?)