Handler+Message源码分析之底层原理剖析
2023-09-18 21:59:59
Handler源码分析
Handler类位于android.os包中,是一个抽象类,它定义了处理消息的接口。Handler主要有以下几个成员变量:
Looper mLooper
:Looper对象,负责管理消息队列和消息循环。MessageQueue mQueue
:消息队列,用于存储消息。Callback mCallback
:回调接口,用于处理消息。
Handler的构造函数如下:
public Handler() {
mLooper = Looper.myLooper();
if (mLooper == null) {
throw new RuntimeException(
"Can't create handler inside thread that has not called Looper.prepare()");
}
mQueue = mLooper.mQueue;
mCallback = null;
}
从构造函数中可以看出,Handler必须在Looper已经准备好的线程中创建。Looper负责管理消息队列和消息循环,它是消息机制的基础。
Handler的handleMessage()
方法用于处理消息。当消息从消息队列中取出后,就会调用handleMessage()
方法来处理消息。handleMessage()
方法的实现如下:
public void handleMessage(Message msg) {
if (mCallback != null) {
mCallback.handleMessage(msg);
}
}
如果Handler设置了回调接口,那么消息就会被转发给回调接口的handleMessage()
方法来处理。回调接口的handleMessage()
方法可以根据消息的内容来执行相应的操作。
Message源码分析
Message类位于android.os包中,它封装了消息的内容。Message主要有以下几个成员变量:
what
:消息的标识。arg1
:消息的第一个参数。arg2
:消息的第二个参数。obj
:消息的对象参数。
Message的构造函数如下:
public Message() {
when = SystemClock.uptimeMillis();
}
Message的构造函数中,将当前时间戳作为消息的时间戳。
Message还提供了几个静态方法来创建消息对象,例如:
obtain()
:从消息池中获取一个消息对象。obtain(Handler)
:从消息池中获取一个消息对象,并设置该消息对象的Handler。obtain(Handler, int)
:从消息池中获取一个消息对象,并设置该消息对象的Handler和消息标识。
Handler和Message的使用示例
下面是一个使用Handler和Message实现跨线程通信的示例代码:
public class MainActivity extends Activity {
private Handler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建Handler对象
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// 处理消息
switch (msg.what) {
case 1:
// 更新UI
TextView tv = findViewById(R.id.tv);
tv.setText("Hello World!");
break;
}
}
};
// 创建子线程
new Thread() {
@Override
public void run() {
// 发送消息
Message msg = mHandler.obtainMessage();
msg.what = 1;
mHandler.sendMessage(msg);
}
}.start();
}
}
在这个示例代码中,我们在主线程中创建了一个Handler对象,并在子线程中发送了一条消息给Handler。Handler收到消息后,会调用handleMessage()
方法来处理消息。在handleMessage()
方法中,我们更新了UI,将“Hello World!”显示在TextView上。
总结
Handler和Message是Android消息机制的核心,它们可以实现跨线程通信。Handler负责管理和分发消息,而Message则封装了消息的内容。通过使用Handler和Message,我们可以轻松地实现跨线程通信,从而使我们的程序更加高效。