一.Handler在不同线程之中的创建
主线程:
子线程:
消息处理流程:
二.带着问题去总结
(一). Handler的意义
Hander本身就是一个大熔炉,将Looper,Message,MessageQueue,ThreadLocal维护起来的,形成一个完整的消息通信机制,handler创建在哪个线程中,并且初始化当前线程的looper,可以在别的线程中,通过此handler发送消息,在创建线程中接收消息,达到消息通信的效果
(二).Looper和MessageQueue的关系:
Looper.prepare() 执行的时候分为三步:
一.Looper和MessageQueue的关系:Looper.prepare() 执行的时候分为三步:
1.判断当前线程是否已经存在looper
2.初始化looper,并且初始化MessageQueue
3.利用初始化的成员变量ThreadLocal的set方法传入Looper对象,并且用ThreadLocalMap将looper和当前ThreadLocal进行绑定,set方法中将Thread中的成员变量 ThreadLocal.ThreadLocalMap threadLocals 赋值,所以在ThreadLocal的get方法中可以取出当前Thread对应的ThreadLocalMap,然后就Looper就可以通过get方法通过线程池拿到当前thread对应的loop
(三).message是和MessageQueue的关系,message在消息通信的过程中经历了哪些过程?
Handler调用sendMessage方法去发送消息,几个发送消息的方法最后都执行了enqueueMessage(@NonNull MessageQueue queue, @NonNull Message msg, long uptimeMillis)
最后执行到MessageQueue中的enqueueMessage方法以链表的形式来到MessageQueue中,通过Looper.loop()中的死循环不断从MessageQueue的next()方法中取出message,最后利用message对应的target(handler)来dispatchMessage(msg)