background image

Android 处理程序:源码研究

线程

Thread 的线程变量 ThreadLocal 中,存放着这个线程的 Looper;Looper 在初始化时,

会新建一个消息队列

MessageQueue ,之后 Looper 进入一个死循环,等待从消息队列

MessageQueue 取得消息 Message(Looper 是消费者),没有消息时会阻塞;

我们程序中的

Handler,会通过 sendMessage 或 post 方法,往 MessageQueue 中添加消

息 时 , 添 加 的 这 个

Message , 会 记 录 他 是 属 于 哪 个 Handler 发 出 的 , 同 时 根 据

message.when,决定新添加的这个 Message 在 Queue 中的位置,MessageQueue 中只有一个
当前的

Message,队列关系是通过 Message 中的 prev,next 维护的,Message 是一个链表的

节点

;

添 加 消 息 后 , 消 费 者

Looper 取 得 Message , 并 调 用 建 立 Message 的 Hander 的

dispatchMessage 方法。

咋一看好像

Handler 即 sendMessage,又 handlerMessage,事情还是只有一个线程在做

事情。

但是后来想想,明白了这样设计的必要性。

因为这个唯一的线程一般而言,都是

mainUI 线程,如果你有个可以分成多个小任务的

任务要处理,你没有使用

Handler,直接执行,也许系统忙于处理你这个任务,而无法及时

响应用户事件,从而导致

ANR 的抛出。

如果你把你的任务拆成几个小任务,用

Handler 来实现,那么系统就可以把你的小任

务推到后面来处理,抽出时间来响应用户操作。

如果真的有大任务,一般式需要另外线程去处理,或者开启

Service。