当前位置:网站首页>全面讲解 Handler机制原理解析 (小白必看)
全面讲解 Handler机制原理解析 (小白必看)
2022-08-03 23:57:00 【AaVictory.】
简介
Handler是Android中提供的一种异步回调机制,也可以理解为线程间的消息通信。
为了避免ANR,我们通常会把一些耗时操作(比如:网络请求、I/O操作、复杂计算等)放到子线程中去执行,而当子线程需要修改UI时则子线程需要通知主线程去完成修改UI的操作,则此时就需要我们使用Handler机制来完成子线程与主线程之间的通信。
一、下面列出Handler相关的重要的类
Handler:处理者,负责Message的发送及处理。使用Handler时,需要实现
handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。
MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行。当然,存放Message并非实际意义的保存,而是将Message以链表的方式串联起来的,等待Looper的抽取。
Looper:消息泵,不断地从MessageQueue中抽取Message执行。因此,一个MessageQueue需要一个Looper。
二、 下面画图分析

理解图
三、整个流程如下:
- 1、以Handler的sendMessage方法为例,当发送一个消息后,会将此消息加入消息队列MessageQueue中。
- 2、Looper负责去遍历消息队列并且将队列中的消息分发给对应的Handler进行处理。
- 3、在Handler的handleMessage方法中处理该消息,这就完成了一个消息的发送和处理过程。
四、Handler 的基本使用
Message
- message.what: 用户定义的消息代码,以便收件人可以识别
- message.arg1 定义传递的int 类型的值1
- message.arg2 定义传递的int 类型的值2
- message.obj 定义传递的值由于类型是object(对象) 所以比较常用,可以传递各种值
- handler.obtainMessage() 带参数形式发送消息,主要的却别代价可以通过下面的demo 区分,
- message.setData() 使用bundle 的实行传参
下面是传参数为例子:
public class MainActivity extends AppCompatActivity {
//创建一个Handler
@SuppressLint("HandlerLeak")
private Handler mhandler=new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
//对接收的message进行处理
switch (msg.what) {
case 1:
Bundle data = msg.getData();
Log.e("TAG", "测试接收数据---" + data.get("姓名"));
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.button);
//点击事件的处理
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Message message=new Message();
message.what=1;
Bundle bundle=new Bundle();
bundle.putString("姓名","张三");
message.setData(bundle);
mhandler.sendMessage(message);
// mhandler.sendEmptyMessage(1);
//sendEmptyMessage((what值)) 发送空的信息,只通知,不传任何参数
}
});
}
}
- 点击后控制台会打印如下:

例二:用handler获取系统实时的时间
边栏推荐
猜你喜欢

RSS feeds WeChat public - feed43 asain

POE交换机全方位解读(下)

Go编译原理系列7(Go源码调试)

简单了解下 TCP,学习握手和挥手以及各种状态到底是怎么样的

View the version number of CUDA, pytorch, etc.

XSLT – 服务器端概述

响应式织梦模板塑身瑜伽类网站

CAS: 178744-28-0, mPEG-DSPE, DSPE-mPEG, methoxy-polyethylene glycol-phosphatidylethanolamine supply

Read FastDFS in one article

POE交换机全方位解读(上)
随机推荐
智能管理PoE交换机
免费的公共WiFi不要乱连,遭中间人攻击了吧?
Creo9.0 绘制中心线
一文搞定 SQL Server 执行计划
用栈实现队列
jav一键生成数据库文档
OpenCV 图像拼接
【每日一题】899. 有序队列
View the version number of CUDA, pytorch, etc.
Why Flutter Flutter of tutorials is the best choice for business?
The problem of disorganized data output by mnn model
搭建好pytorch环境后,pip和conda指令不能用
FPGA按键消抖+蜂鸣器
汉字风格迁移---结合本地和全局特征学习的中文字体迁移
【深度学习】基于tensorflow的服装图像分类训练(数据集:Fashion-MNIST)
通过whl安装第三方包
Jmeter-参数化
HNUCM 2022年暑假ACM搜索专项练习
响应式织梦模板餐饮酒店类网站
SolidEdge ST8安装教程