简介
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(){@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);//对接收的message进行处理switch (msg.what) {case 1:Bundle data = msg.getData();Log.e("TAG", "测试接收数据---" + data.get("姓名"));break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button = findViewById(R.id.button);//点击事件的处理button.setOnClickListener(new View.OnClickListener() {@Overridepublic 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获取系统实时的时间
点击参考获取实时的时间
















