一些Hanlder源码的简单分析
程序员文章站
2022-03-08 11:38:03
...
Hanlder:
ActivityThread 主线程: Looper.prepareMainLooper(); -> 会初始化looper , 所以开发者不用在主线程中去手动创建looper,其他线程需要。
自己初始化方法:Looper.prepare();
自己创建looper初始化方法:prepare(true); 参数quitAllowed
主线程自己创建looper初始化方法:prepare(false); 参数quitAllowed
//保证只有一个looper
private static void prepare(boolean quitAllowed) {
if (sThreadLocal.get() != null) {
throw new RuntimeException("Only one Looper may be created per thread");
}
sThreadLocal.set(new Looper(quitAllowed));
}
参数quitAllowed:是否允许退出的标志
void quit(boolean safe) {
if (!mQuitAllowed) {
throw new IllegalStateException("Main thread not allowed to quit.");
}
. . .
}
在子线程中使用
Looper.prepare();
...可以进行更新ui的操作
Looper.loop();
看上述可知,looper会在本线程创建对象,使线程拥有自己的消息列队,主线程拥有自己的消息列队,一般线程创建时没有自己的消息列队,消息处理时就在主线程中完成,如果线程中使用Looper.prepare()和Looper.loop()创建了消息队列就可以让消息处理在该线程中完成