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

摘要:
本文主要介绍处理程序的工作流程。此时,我们需要使用处理程序作为媒介,让处理程序通知主线程逐个更新UI,以避免不安全的UI线程。④消息处理◆ 处理器接收处理器发送的消息;◆ 处理器根据消息进行处理。图3-线程、循环器和处理器之间的关系

  

由于Android采用的是单线程模式,开发者无法在子线程中更新 UI,所以系统给我提供了 Handler 这个类来实现 UI 更新问题。本贴主要说明 Handler 的工作流程。

1. Handler 的作用

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

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

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

图1 - 消息传递流程

 

 2. Handler 相关概念解释

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

概念

定义

作用

备注

主线程

(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所示):

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

图2 - Handler 机制工作流图

4. 总结

最后需要注意几点:

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

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

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

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

免责声明:文章转载自《Handler 机制(一)—— Handler的实现流程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇twig的 function 学习Javascript自定义数组删除方法remove()下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

asp.net core 系列 5 项目实战之:NetCore 的 async 和 await(参考自:Microsoft教程)

十年河东,十年河西,莫欺少年穷 学无止境,精益求精 1、简介 从 VS 2012 开始,新引入了一个简化的方法,称为异步编程。我们在 >= .NETFRM 4.5 中和 Windows 运行时中使用异步,编译器它会帮助了我们降低了曾经进行的高难度异步代码编写的工作,但逻辑结构却类似于同步代码。因此,我们仅需要进行一小部分编程的工作就可以获得异步编程的...

VC终止线程,ExitThread函数,Te r m i n a t e T h r e a d函数,撤消线程,详解

VC-终止线程,ExitThread函数,Te r m i n a t e T h r e a d函数,撤消线程,详解 6.5 终止线程的运行 若要终止线程的运行,可以使用下面的方法: •  线程函数返回(最好使用这种方法)。 •  通过调用E x i t T h r e a d函数,线程将自行撤消(最好不要使用这种方法)。 •  同一个进程或另一个进程中的...

java多线程:jdk并发包的总结(转载)

转载地址:http://blog.csdn.net/yangbutao/article/details/8479520 1、java 高并发包所采用的几个机制(CAS,volatile,抽象队列同步)    CAS(乐观操作),jdk5以前采用synchronized,对共享区域进行同步操作,synchronized是重的操作,在高并发情况下,会引起线程...

找到一个不错的消息提示组件 ymPrompt V4.0

找到一个不错的消息提示组件,分享给朋友们,本文转载于ymPrompt V4.0版本发布【2009-03-02更新】,本文是参考它的demo。非常感谢原作者: ymPrompt消息提示组件4.0版使用简介 更换皮肤:QQ Simple SimpleGray VISTA dmm-Green bluebar black  修改默认配置:拖动窗体的透明度: 遮...

转 MYSQL监控工具--mytop

MYSQL监控工具--mytop   https://mp.weixin.qq.com/s/1X_uZaajImRRmpAsdLsNGw mysql可以说如今最为流行的数据库了,虽然现在nosql的风头正盛。但我想很多公司重要的业务数据不会用nosql去跑。而在这些方面mysql似乎的使用更盛(开源免费,让我花钱去买oracle,我想我是不会买的)。君...

Sqlite多线程相关整理

Sqlite多线程相关整理 Sqlite With MultiThreads 什么是线程安全? 当多个线程访问某个方法时,不管你通过怎样的调用方式、或者说这些线程如何交替地执行,我们在主程序中不需要去做任何的同步,这个类的结果行为都是我们设想的正确行为,那么我们就可以说这个类是线程安全的。 一 来自官方FAQ https://www.sqlite.org/...