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)。
|
概念 |
定义 |
作用 |
备注 |
|
主线程 (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 之间的关系
Handler 机制(一)—— Handler的实现流程的更多相关文章
- 为什么要有handler机制?handler机制的原理
为什么要有handler机制? 在Android的UI开发中,我们经常会使用Handler来控制主UI程序的界面变化.有关Handler的作用,我们总结为:与其他线程协同工作,接收其他线程的消息并通过 ...
- Android 为什么要有handler机制?handler机制的原理
为什么要有handler机制? 在Android的UI开发中,我们经常会使用Handler来控制主UI程序的界面变化.有关Handler的作用,我们总结为:与其他线程协同工作,接收其他线程的消息并通过 ...
- Android Handler机制(四)---Handler源码解析
Handler的主要用途有两个:(1).在将来的某个时刻执行消息或一个runnable,(2)把消息发送到消息队列. 主要依靠post(Runnable).postAtTime(Runnable, l ...
- 【转载】Android 的 Handler 机制实现原理分析
handler在安卓开发中是必须掌握的技术,但是很多人都是停留在使用阶段.使用起来很简单,就两个步骤,在主线程重写handler的handleMessage( )方法,在工作线程发送消息.但是,有没有 ...
- 面试官:“看你简历上写熟悉 Handler 机制,那聊聊 IdleHandler 吧?”
一. 序 Handler 机制算是 Android 基本功,面试常客.但现在面试,多数已经不会直接让你讲讲 Handler 的机制,Looper 是如何循环的,MessageQueue 是如何管理 M ...
- Android多线程----异步消息处理机制之Handler详解
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Handler机制原理图、源码、使用!!!!!
android的消息处理机制——Looper,Handler,Message (原理图.源码) 转自:http://my.oschina.net/u/1391648/blog/282892 在开始讨 ...
- Android Handler 机制 - Looper,Message,MessageQueue
Android Studio 2.3 API 25 从源码角度分析Handler机制.有利于使用Handler和分析Handler的相关问题. Handler 简介 一个Handler允许发送和处理M ...
- Android开发之漫漫长途 ⅥI——Android消息机制(Looper Handler MessageQueue Message)
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
随机推荐
- Java引用的分类
Java引用分为强引用.软引用.弱引用和虚引用. 强引用就是指在程序代码中普遍存在的,类似“Object obj = new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被 ...
- 浅谈Python导入外部文件
import 和 from ... import * 有什么区别? 例如我写了个模块hello.py def print_func(args): print("Hello " + ...
- 页面静态化--Thymeleaf
1.Thymeleaf简介 官方网站:https://www.thymeleaf.org/index.html Thymeleaf是用来开发Web和独立环境项目的现代服务器端Java模板引擎. Thy ...
- WIFI:802.11无线LAN
IEEE 802.11 无线LAN(也称WiFi) IEEE是什么 电气和电子工程师协会(IEEE,全称是Institute of Electrical and Electronics Enginee ...
- 家庭记账本app实现登录注册界面以及仿微信操作界面(共4个实现一个)遇到了麻烦
今天学习了数据的创建,以及关于数据库的相关操作. 今天主要是实现了对于数据库的增加和查找. 具体的代码如下: 首先是数据库的创建: DBOpenMessage.java package com.exa ...
- Linq下有一个非常实用的SelectMany方法,很多人却不会用
在平时开发中经常会看到有些朋友或者同事在写代码时会充斥着各种for,foreach,这种程式代码太多的话阅读性特别差,而且还显得特别累赘,其实在FCL中有很多帮助我们提高阅读感的方法,而现实中很多人不 ...
- Linux 任务管理篇(一)
查看网络的联机状态 netstat -a 查看后台执行的程序 ps -aux 将内存中的数据快速写入到硬盘中 sync
- Array(数组)对象-->概念和创建
1.什么是数组? 数组对象是使用单独的变量名来存储一系列的值. 2.数组创建的三种方法: 方法1:常规方式 var arr=new Array(); arr[0]="lisa"; ...
- 2、使用断言(json assertion)
1.假设现在有一个服务端的返回数据(需要测试的)为:HTTP/1.1 200 OK,要测试的响应字段勾选Response Headers,模式匹配规则选择Substring,把该响应断言命名为Http ...
- web自动化测试中的PO模式(一)
1.PO模式的思想 原理: 将页面的元素定位和元素行为封装成一个page类 类的属性:元素的定位 类的行为:元素的操作 页面对象和测试用例分离 测试用例: 调用所需要页面对象中的行为,组成测试用例 测 ...