1、HandlerThread在run中调用了Looper.prepare();初始化Looper;
2、再通过Looper的myLooper()获取这个初始化的Looper。而Looper的构造当中,初始化了MessageQueue,并获得当前线程。
3、Looper.prepare()中,将Looper放进ThreadLocal中,ThreadLocal存储了一份变量。。
4、接着 这里调用了 notifyAll(); 唤醒所有的线程?---在getLooper中有个wait,如果你get的话,会get不到,需要等到notifyAll执行完后,才能获取到,解决同步问题。
5、然后调用Looper.loop(); 运行这个线程的消息队列
6、这里会获取到Looper和MessageQueue,获取MessageQueue中的Message,然后通过Handler处理message。这行代码:msg.handler.dispatchMessage(msg);
总结:在Activity中,有系统的Looper,所以在子线程中执行耗时的操作后,
Activity通过Handler,使用Looper在MessageQueue中获取Message,进行处理。
而在子线程中,需要达到这种效果,需要在子线程中创建Handler的Looper,于是就有了封装了Looper的thread,为HandlerThread。
网友评论