当前位置:网站首页>全面讲解 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获取系统实时的时间
边栏推荐
猜你喜欢
随机推荐
关于mnn模型输出的数据杂乱无章问题
Super perfect version of the layout have shortcut, background replacement (solve the problem of opencv Chinese path)
The Beijing E-sports Metaverse Forum was successfully held
(PC+WAP)织梦模板不锈钢类网站
数据分析知识点搜集(纯粹的搜集)
用栈实现队列
通过whl安装第三方包
【并发编程】ReentrantLock的lockInterruptibly()方法源码分析
689. 三个无重叠子数组的最大和
响应式织梦模板塑身瑜伽类网站
YOLOv7改进之二十二:涨点神器——引入递归门控卷积(gnConv)
用队列模拟实现栈
curl使用指南
1067 Sort with Swap(0, i)
Jar a key generation document database
电子邮件安全或面临新威胁!
Creo9.0 绘制中心线
七夕?new一个对象
Flutter教程之为什么 Flutter 是创业的最佳选择?
OpenCV 图像拼接