「这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战」
概述
Handler在我们android开发中是一项非常重要的机制,Handler是android提供用于更新UI的一套机制,也是消息处理机制。Handler的主要作用有两个:
- 在启动的线程中发送消息
- 在主线程中获取并处理消息。
Android在设计的时候,就封装了一套消息创建,传递,处理机制,如果不遵循这样的机制,就没有办法更新UI信息的,就会抛出异常信息。因此必须要用Handler发送消息去更新UI。
要想理解Handler消息机制原理还需要了解几个概念:Handler、UI线程、Message、MessageQueue、Looper。
Handler: 发送处理消息。发送消息一般是使用Handler的sendMessager()方法。
UI线程: ActivityThread主线程**下篇文章我们进行详细的介绍。
Message: Handler请求和相应的消息,由MessageQueue进行管理。
MessageQueue: 消息队列,存放Message,先进先出,内部是单链表的结构。每个线程中只会有一个MessageQueue对象。
Looper: Lopper是每个线程中的的MessageQueue的管家,调用Looper的loop()方法后会进入一个无限循环中,每当发现MessageQueue中存在一条消息,就将他取出,并传递到Handler的handleMessage()方法中。每个县城中只有一个Looper对象。
基本使用
一般使用Handler发送消息需要两步,首先创建一个Handler对象,重写handleMessage方法。在需要消息通信的地方,通过Handler的sendMessage方法发送消息。
子线程中发送消息
// 创建一个子线程,在子线程中发送消息
new Thread(new Runnable() {
@Override
public void run() {
Message msg = Message.obtain();
msg.what = 1;
msg.obj = "这是一个来自子线程的消息";
// 2.发送消息
mHandler.sendMessage(msg);
}
}).start();
消息处理
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 处理消息
switch (msg.what) {
case 1:
// 打印出处理消息的线程名和Message.obj
Log.e(TAG, "接收到消息: " + Thread.currentThread().getName() + ": "+ msg.obj);
break;
default:
break;
}
}
};
现在对handler就有了简单的了解,下面的文章继续分析研究。