当前位置:网站首页>全面讲解 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获取系统实时的时间
边栏推荐
猜你喜欢

YOLOv7改进之二十二:涨点神器——引入递归门控卷积(gnConv)
![[Paper Reading] TRO 2021: Fail-Safe Motion Planning for Online Verification of Autonomous Vehicles Using Conve](/img/17/342676e20fc04ce9083c5ed443bc1d.png)
[Paper Reading] TRO 2021: Fail-Safe Motion Planning for Online Verification of Autonomous Vehicles Using Conve

射频芯片(RFIC)的协议之5G及其调制

并查集详解

XSLT – 服务器端概述

用栈实现队列

【MySQL —— 索引】

Node.js的基本使用(三)数据库与身份认证

Unity intercepts 3D images and the implementation of picture-in-picture PIP

响应式织梦模板塑身瑜伽类网站
随机推荐
[Miscellaneous] How to install the specified font into the computer and then use the font in the Office software?
RSS订阅微信公众号初探-feed43
浅谈我国产业园区未来的发展方向
Why Flutter Flutter of tutorials is the best choice for business?
Using matlab to solve the linear optimization problem based on matlab dynamic model of learning notes _11 】 【
Creo 9.0在草图环境中创建坐标系
rsync basic usage
[Paper Reading] TRO 2021: Fail-Safe Motion Planning for Online Verification of Autonomous Vehicles Using Conve
(PC+WAP)织梦模板螺钉手柄类网站
做项目一定用得到的NLP资源【分类版】
corn表达式 具体详解与案例
我的祖国
Prometheus监控Harbor(二进制版)
易动纷享--测试实习生视频面试
简单了解下 TCP,学习握手和挥手以及各种状态到底是怎么样的
The super perfect layout has shortcut keys and background replacement
HNUCM 您好中国
初始 List 接口
The "interaction design" battle of the smart cockpit
小米--测试开发