当前位置:网站首页>全面讲解 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获取系统实时的时间
边栏推荐
猜你喜欢
随机推荐
win10+cuda11.7+pytorch1.12.0 installation
数据分析知识点搜集(纯粹的搜集)
超级完美版布局有快捷键,有背景置换(解决opencv 中文路径问题)
现货白银需要注意八大事项
SolidEdge ST8安装教程
LYVE1抗体丨Relia Tech LYVE1抗体解决方案
leetcode/子串中不能有重复字符的最长子串
corn表达式 具体详解与案例
用两个栈模拟队列
响应式织梦模板除尘器类网站
Jmeter-参数化
JVM垃圾回收总结(未完待续)
射频芯片(RFIC)的协议之5G及其调制
libnet
Creo9.0 绘制中心线
电子邮件安全或面临新威胁!
A simple understanding of TCP, learn how to shake hands, wave hands and various states
ros mavros stereo读取rosbag并记录IMU和图片到文件夹
rosbridge-WSL2 && carla-win11
【深度学习】基于tensorflow的服装图像分类训练(数据集:Fashion-MNIST)

![2022-08-03:以下go语言代码输出什么?A:2;B:3;C:1;D:0。 package main import “fmt“ func main() { slice := []i](/img/a9/6de3c2bae92d09b13b1c36e01f86c2.png)







