Handler 主要用于线程间通信
四个要素
以下解释摘抄自<<第一行代码>>:
- Message:
Message 是在线程之间传递的消息,它可以在内部携带少量的信息, 用于在不同线程间传递数据. Message 的what,arg1和arg2 字段用来携带整型数据, obj 字段用来携带一个 Object 对象. - Handler:
Handler 顾名思义就是处理者的意思, 它主要是用于发送和处理消息. 发送消息一般是使用 Handler 的 sendMessage() 方法,post() 方法等, 而发出的消息经过一系列的辗转处理后, 最终会传递到 Handler 的 handlerMessage() 方法中. - MessageQueue:
MessageQueue 是消息队列的意思, 它主要用于存放所有通过 Handler 发送的消息. 这部分消息会一直存在于消息队列中, 等待被处理. 每个线程中只会有一个 MessageQueue 对象. - Looper:
Looper 是每个线程中的MessageQueue 的管家,调用 Looper 的 loop() 方法后, 就会进入一个无限循环当中, 然后每当发现 MessageQueue 中存在一条消息时,就会将它取出, 并传递到 Handler 的 handleMessage() 方法中. 每个线程中只会有一个 Looper 对象.
源码简单解释
创建handler对象前,须确保handler所在的线程已调用过
Looper.prepare()
Looper.prepare()、new Handler()、Loop.loop()
的调用须在同一个线程
-
A线程:Looper.prepare(); 该方法执行以下操作:
new Looper();
Looper构造函数会执行以下操作:创建消息队列 mQueue = new MessageQueue()
持有当前线程 mThread = Thread.currentThread();- 通过 sThreadLocal.set(new Looper()) 与当前线程绑定
为保证 looper 对象唯一,每个线程只能prepare一次
-
A线程:
handler = new Handler();
Handler会执行以下操作:通过Looper.myLooper() 持有 looper 对象
通过looper.mQueue 持有 MessageQueue 对象 -
A线程:
Loop.loop();
loop方法会执行以下操作:- 通过 myLooper() 得到 looper 对象
- 通过 looper.mQueue 得到 MessageQueue 对象 queue
- 创建for(;;)死循环:
通过queue.next() 得到 Message 对象 msg
通过msg.target.dispatchMessage(msg) 最终调用 handler.handleMessage(msg) 方法
另外,通过 looper.quit() 可以结束这个死循环
-
B线程:
handler.sendMessage(message);
该方法执行以下操作:- message 通过
message.target = this
持有handler - 通过 enqueueMessage(queue, message, uptimeMillis) 将message添加到 MessageQueue 消息队列中
- message 通过