当前位置:网站首页>全面讲解 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获取系统实时的时间
边栏推荐
- 国内首发可视化智能调优平台,小龙带你玩转KeenTune UI
- corn表达式 具体详解与案例
- 【职场杂谈】售前与销售工作配合探讨
- jav一键生成数据库文档
- 通过whl安装第三方包
- After building the pytorch environment, the pip and conda commands cannot be used
- Using matlab to solve the linear optimization problem based on matlab dynamic model of learning notes _11 】 【
- 单例模式使用饿汉式和懒汉式创建一定安全?很多人不知
- 数据分析知识点搜集(纯粹的搜集)
- 小米--测试开发
猜你喜欢
随机推荐
The problem of disorganized data output by mnn model
Graph-node:创建一个新的subgraph
View the version number of CUDA, pytorch, etc.
The Chinese Valentine's Day event is romantically launched, don't let the Internet slow down and miss the dark time
C语言实验十四 结构体
BPF 可移植性和 CO-RE(一次编译,到处运行)
SolidEdge ST8安装教程
【职场杂谈】售前与销售工作配合探讨
Redis persistence method
Scala basics [regular expressions, framework development principles]
LeetCode 0155. 最小栈
Fluorescein-PEG-CLS, cholesterol-polyethylene glycol-fluorescein scientific research reagent
Unity2021 releases WebGL fog effect disappearing problem
XSLT – 编辑 XML概述
2022-08-03:以下go语言代码输出什么?A:2;B:3;C:1;D:0。 package main import “fmt“ func main() { slice := []i
The longest substring that cannot have repeating characters in a leetcode/substring
In V8 how arrays (with source code, picture and text easier to understand)
Creo 9.0在草图环境中创建坐标系
It will invest about 200 billion US dollars in the United States in 20 years, and Samsung Electronics looks so handsome
七夕?new一个对象






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


