欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一些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()创建了消息队列就可以让消息处理在该线程中完成