解密Handler源码(第一部分)
2023-12-31 22:32:20
Handler简介
Handler是Android应用程序中用于处理消息的类,它是一个异步消息处理机制,允许应用程序在主线程之外执行任务。Handler可以用来更新UI、执行网络请求、定时任务等。
Handler的使用
Handler的使用很简单,通常只需以下三个步骤:
- 创建一个Handler实例。
- 向Handler发送消息。
- 在Handler中处理消息。
构造函数分析
Handler有多个构造函数重载,其中最常用的一个构造函数是无参构造函数。这个构造函数会创建一个Handler实例,该实例与当前线程关联。
public Handler() {
this(Looper.myLooper(), null, false);
}
第二个构造函数允许指定一个Looper对象,这个Looper对象指定了消息循环,消息循环是一个不断循环处理消息的机制。如果Looper对象为null,则Handler将使用当前线程的Looper对象。
public Handler(Looper looper) {
this(looper, null, false);
}
第三个构造函数允许指定一个HandlerCallback对象,该对象实现了Handler.Callback接口,该接口定义了如何处理消息的方法。如果HandlerCallback对象为null,则Handler将使用默认的处理方法。
public Handler(Looper looper, Callback callback) {
this(looper, callback, false);
}
第四个构造函数允许指定一个HandlerCallback对象和一个布尔值,该布尔值指定是否将Handler与当前线程关联。如果布尔值为true,则Handler将与当前线程关联。
public Handler(Looper looper, Callback callback, boolean async) {
mQueue = looper.getQueue();
mCallback = callback;
mAsynchronous = async;
}
向Handler发送消息
向Handler发送消息可以通过Handler的sendMessage()方法,该方法允许发送一个Message对象。Message对象包含了要发送的消息内容,以及消息的处理方法。
public final boolean sendMessage(Message msg) {
return sendMessageDelayed(msg, 0);
}
sendMessageDelayed()方法允许发送一个Message对象,并指定延迟的时间。延迟的时间以毫秒为单位。
public final boolean sendMessageDelayed(Message msg, long delayMillis) {
if (delayMillis < 0) {
delayMillis = 0;
}
return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}
sendMessageAtTime()方法允许发送一个Message对象,并指定发送的时间。发送的时间以毫秒为单位。
public final boolean sendMessageAtTime(Message msg, long uptimeMillis) {
MessageQueue queue = mQueue;
if (queue == null) {
RuntimeException e = new RuntimeException(
this + " sendMessageAtTime() called with no mQueue");
Log.w("TAG", e.getMessage(), e);
throw e;
}
return enqueueMessage(queue, msg, uptimeMillis);
}
enqueueMessage()方法将Message对象放入消息队列中,消息队列是一个先进先出的队列,这意味着最早发送的消息将首先被处理。
private static final boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
msg.target = queue.mIdleHandler.thisMessageTarget;
if (msg.target == null) {
throw new IllegalStateException(msg.toString()
+ " does not have a target.");
}
return queue.enqueueMessage(msg, uptimeMillis);
}
在Handler中处理消息
当消息被发送到Handler后,Handler会调用handleMessage()方法来处理消息。handleMessage()方法可以根据Message对象的内容来执行不同的操作。
public void handleMessage(Message msg) {
if (mCallback != null) {
mCallback.handleMessage(msg);
} else {
handleMessage(msg);
}
}
如果HandlerCallback对象不为null,则调用HandlerCallback对象的handleMessage()方法来处理消息。否则,调用Handler自身的handleMessage()方法来处理消息。
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_UPDATE_UI:
// 更新UI
break;
case MSG_NETWORK_REQUEST:
// 执行网络请求
break;
case MSG_定时任务:
// 执行定时任务
break;
}
}
结语
本篇博客带领大家初步认识了Handler的使用,以及Handler是如何处理消息的。在下一部分中,我们将继续深入Handler的源码,分析Handler的内部实现细节,敬请期待。