android
的消息处理有三个核心类:
Looper,Handler
和
Message
。其实还有一个
Message Queue
(消息队列),但是
Message Queue
被封装到
Looper
里面了,我们不会直接与
Message Queue
打交道。
l
Looper
:
Looper
的字面意思是“循环者”,它被设计用来使一个普通线程变成
Looper
线程。所谓
Looper
线程就是循环工作的线程。在程序开发中(尤其是
GUI
开发中),我们经常会需要一个线程不断循环,一旦有新任务则执行,执行完继续等待下一个任务,这就是
Looper
线程。
n
Looper.prepare()
:现在你的线程中有一个
Looper
对象,它的内部维护了一个消息队列。注意,一个
Thread
只能有一个
Looper
对象
Looper.loop()
:调用
loop
方法后,
Looper
线程就开始真正工作了,它不断从自己的
MQ
中取出队头的消息
(
也叫任务
)
执行
Handler
:
handler
扮演了往
MQ
上添加消息和处理消息的角色(只处理由自己发出的消息),即通知
MQ
它要执行一个任务
(sendMessage)
,并在
loop
到自己的时候执行该任务
(handleMessage)
,整个过程是异步的。
handler
创建时会关联一个
looper
,默认的构造方法将关联当前线程的
looper
,不过这也是可以
set
的。
n
加入
Handler
后:一个线程可以有多个
Handler
,但是只能有一个
Looper
Hander
的两个特点:
n
handler
可以在任意线程发送消息,这些消息会被添加到关联的
MQ
上
handler
是在它关联的
looper
线程中处理消息的
通过如上步骤,就解决了
android
最经典的不能在其他非主线程中更新
UI
的问题。
android
的主线程也是一个
looper
线程
(looper
在
android
中运用很广
)
,我们在其中创建的
handler
默认将关联主线程
MQ
。因此,利用
handler
的一个
solution
就是在
activity
中创建
handler
并将其引用传递给
worker thread
,
worker thread
执行完任务后使用
handler
发送消息通知
activity
更新
UI
全过程