-
在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的异步消息传递机制的工作原理 讲解完毕