Android在子线程用handler发送的消息,主线程是怎么loop到的

2025年03月13日 06:56
有1个网友回答
网友(1):

因为你是在主线程创建的handler实例,比如你是这样实例化handler

那么我们进到handler源码看一下

可以看到这里会调用重载的另外一个构造方法,我们再跟进

我们可以看到 mLooper=looper.myLooper();  这是获取当前线程的looper实例,也就是主线程的looper。所以当发送消息的时候主线程就可以获取到消息。往下看系统还会mLooper是否为空,如果为空就会抛出异常,意思是当前线程没有looper实例,这也是我们在子线程中没有创建looper的实例的时候创建handler会报错的原因,主线程不会报错是因为程序在启动的时候在activitythread中的main方法就创建了looper实例,看系统源码

然后调用looper.loop();就开始了消息循环。这就是为什么在主线程发消息住线程还能收到消息的原因。因为发送消息的实例是在主线程实例化的就有了主线程的looper。