Handler 机制(一)—— Handler的实现流程


  

因为Android采用的是单线程模式,开发者没法在子线程中更新 UI,因此系统给我提供了 Handler 这个类来实现 UI 更新问题。本贴主要说明 Handler 的工做流程。安全

1. Handler 的做用

在Android为了保障线程安全,规定只能由主线程来更新UI信息。而在实际开发中,会常常遇到多个子线程都去操做UI信息的状况,那么就会致使UI线程不安全。这时,咱们就须要借助 Handler 做为媒介,让 Handler 通知主线程按顺序一个个去更新UI,避免UI线程不安全。网络

那么,子线程要更新UI的信息时,咱们就须要将要更新的消息传递到 UI主线程中,再由主线程完成更新,从而实现工做线程对UI的更新处理,最终完成异步消息的处理(如图1所示)。数据结构

 

图1 - 消息传递流程异步

 

 2. Handler 相关概念解释

 主要涉及的有:处理器(Handler)、消息(Message)、消息队列(Message Queue)、循环器(Looper)oop

概念spa

定义线程

做用code

备注对象

主线程blog

(Main Thread)

当应用第一次启动时,

就会开启一条主线程。

处理与UI相关的事件

主线程

通信媒介:Handler

子线程

子线程 人为手动开启的

执行耗时的操做

(如,网络请求等)

消息

(Message)

线程间通信的数据单元

(即Handler接受/处理的对象)

存储须要操做的信息  

消息队列

(Message Queue)

一种数据结构

(队:先进先出)

存储Handler发来的消息

(Message)

 

处理者

(Handler)

◆ 主线程与子线程的通信媒介;

◆ 线程消息的处理者。           

◆ 添加消息(Message)到消息队列(Message Queue);

◆ 处理由循环器(Looper)分配过来的消息(Message)。 

 

循环器

(Looper)

消息队列(Message Queue)与 Handler的通信媒介

消息循环即:

◆ 消息获取:循环取出消息队列(Message Queue)中的消息(Message);

◆ 消息分发:将取出的消息(Message)发送给对应的处理者(Handler)。

 

 

3. 工做原理及流程

Handler 机制流程主要包含4个步骤:

        ① 异步通信;

        ② 消息发送;

        ③ 消息循环;

        ④ 消息处理。

详情以下表所示:

步骤 具体描述 备注
① 异步通信

在主线程中建立:

◆ 处理器对象(Looper)

◆ 消息队列对象(Message Queue)

◆ Handler对象

◆ Looper、Message Queue均属于主线程;

◆ 建立完Message Queue后,Looper自动进行消息循环;

◆ 此时,Handler自动绑定到主线程的Looper和Message Queue。

② 消息发送 子线程经过Handler发送消息消息(Message)到消息队列(Message Queue)中。 消息内容 =  子线程对UI的操做
③ 消息循环

◆ 消息出队:Looper从消息队列(Message Queue)中循环取出消息(Message);

◆ 消息分发:Looper将取出的消息(Message)分发给消息的处理者(Handler)。

在消息循环过程当中,若是消息队列为空,则自动阻塞。
④ 消息处理

◆ 处理者(Handler)接受处处理器(Looper)发送过来的消息(Message);

◆ 处理者(Handler)根据消息(Message)进行处理。

 

 

工做流图(如图2所示):

 

图2 - Handler 机制工做流图

 

4. 总结

最后须要注意几点:

线程(Thread)、循环器(Looper)、处理器(Handler)之间的关系以下:

  • 一个线程(Thread)只能绑定一个循环器(Looper);但一个Thread能够有多个处理器(Handler)。
  • 一个循环器(Looper)可绑定多个处理器(Handler)。
  • 一个处理器(Handler)只能绑定一个循环器(Looper)。

 

图3 - Thread、Looper、Handler 之间的关系

相关文章
相关标签/搜索