在Android开发的多线程应用场景中,handler机制十分常用
今天,我将献上一份 全面、详细的
Handler
机制 学习攻略,含简介、使用、工作原理 & 源码分析,希望你们会喜欢
1. 定义
一套 Android
消息传递机制
2. 作用
在多线程的应用场景中,将工作线程中需更新UI
的操作信息 传递到 UI
主线程,从而实现 工作线程对UI
的更新处理,最终实现异步消息的处理
示意图
3. 为什么要用 Handler
消息传递机制
答:多个线程并发更新UI的同时 保证线程安全
具体描述如下
示意图
4. 相关概念
关于 Handler
异步通信机制中的相关概念如下:
在下面的讲解中,我将直接使用英文名讲解,即
Handler
、Message
、Message Queue
、Looper
,希望大家先熟悉相关概念
示意图
5. 使用方式
Handler
的使用方式 因发送消息到消息队列的方式不同而不同共分为2种:使用
Handler.sendMessage()
、使用Handler.post()
关于
Handler
的具体使用:方式1:使用 Handler.sendMessage()
在该使用方式中,又分为2种:新建
Handler
子类(内部类)、匿名Handler
类但本质相同,即 继承了
Handler
类 & 创建了子类
/**
* 方式1:新建Handler子类(内部类)
*/
// 步骤1:自定义Handler子类(继承Handler类) & 复写handleMessage()方法
class mHandler extends Handler { // 通过复写handlerMessage() 从而确定更新UI的操作
@Override
public void handleMessage(Message msg) {
...// 需执行的UI操作
}
} // 步骤2:在主线程中创建Handler实例
private Handler mhandler = new mHandler(); // 步骤3:创建所需的消息对象
Message msg = Message.obtain(); // 实例化消息对象
msg.what = 1; // 消息标识
msg.obj = "AA"; // 消息内容存放
// 步骤4:在工作线程中 通过Handler发送消息到消息队列中
// 可通过sendMessage() / post()
// 多线程可采用AsyncTask、继承Thread类、实现Runnable
mHandler.sendMessage(msg); // 步骤5:开启工作线程(同时启动了Handler)
// 多线程可采用AsyncTask、继承Thread类、实现Runnable/**
* 方式2:匿名内部类
*/
// 步骤1:在主线程中 通过匿名内部类 创建Handler类对象
private Handler mhandler = new Handler(){ // 通过复写handlerMessage()从而确定更新UI的操作
@Override
public void handleMessage(Message msg) {
...// 需执行的UI操作
}
}; // 步骤2:创建消息对象
Message msg = Message.obtain(); // 实例化消息对象
msg.what = 1; // 消息标识
msg.obj = "AA"; // 消息内容存放
// 步骤3:在工作线程中 通过Handler发送消息到消息队列中
// 多线程可采用AsyncTask、继承Thread类、实现Runnable
mHandler.sendMessage(msg); // 步骤4:开启工作线程(同时启动了Handler)
// 多线程可采用AsyncTask、继承Thread类、实现Runnable
方式2:使用Handler.post()
// 步骤1:在主线程中创建Handler实例
private Handler mhandler = new mHandler(); // 步骤2:在工作线程中 发送消息到消息队列中 & 指定操作UI内容
// 需传入1个Runnable对象
mHandler.post(new Runnable() { @Override
public void run() {
... // 需执行的UI操作
}
}); // 步骤3:开启工作线程(同时启动了Handler)
// 多线程可采用AsyncTask、继承Thread类、实现Runnable
6,Handler
机制的工作流程主要包括4个步骤:
异步通信准备
消息发送
消息循环
消息处理
具体如下图:
示意图
7,工作流程图
示意图
7.1 示意图
示意图
8,特别注意
线程(Thread)
、循环器(Looper)
、处理者(Handler)
之间的对应关系如下:
1个线程
(Thread)
只能绑定 1个循环器(Looper)
,但可以有多个处理者(Handler)
1个循环器
(Looper)
可绑定多个处理者(Handler)
1个处理者
(Handler)
只能绑定1个1个循环器(Looper)
示意图
至此,关于Handler
的异步消息传递机制的工作原理 讲解完毕