Handler用于多线程消息分发和处理。与handler相关的几个对象:Message, Looper,MessageQueue, ThreadLocal.
Handler是Message的消费者。
MessageQueue是容器。
Looper是整个Message分发的驱动。
Handler中有多种发送消息的方法,其中postxxx的传参为Runable,sendxxx的传参为Message.
postxxx本质都调用sendxxx。sendxxx最终会调用MessageQueue的enqueueMessage。
Handler的基本使用方式如下。
Looper会帮助当前的线程创建一个message queue和looper,来驱动消息传递。
Looper.loop()则会阻塞进程,当收到消息时再触发进程。(Looper.loop()后的代码不会被执行)。
从代码中可以看出,连续两次Looper.prepare,会报错。
ThreadLocal是一个Map<key, value>。key为当前线程。所ThreadLocal.get(),是以当前线程为key做检查。如果有value,则表示loop已创建。
所以,一个线程里有一个looper,一个looper对应一个messageQueue。
但Handler可以有多个,可以传递不同结构的message,并处理对应的message。
Message中,包含handler本身,在将Message放入MessageQueue中时,对Message.target进行赋值。
在主进程中,之所以不需要执行Looper.prepare和Looper.loop,是因为主线程中的ActivityThread已经创建了Looper和Handler。
Message创建方式有两种:new Message()和Message.obtain(),区别在于后者使用单向链表。
在消息量大的情况下,前者仅在GC时集中释放内存,会造成内存抖动。