安卓中的Handle是一个非常重要的类,它主要用于处理消息和线程之间的通信。在本篇博客中,我们将对安卓中的Handle源码进行分析,希望能够帮助读者更好地理解这个类的实现原理。
首先,我们来看一下Handle的构造函数:
public Handle() {
this(null, false);
}
可以看到,Handle的构造函数并没有做太多的事情,只是简单地调用了另一个构造函数,并传入了两个参数:null和false。
接下来,我们来看一下另一个构造函数:
public Handle(Callback callback, boolean async) {
mLooper = Looper.myLooper();
if (mLooper == null) {
throw new RuntimeException(
"Can't create Handle inside thread that has not called Looper.prepare()");
}
mQueue = mLooper.mQueue;
mCallback = callback;
mAsynchronous = async;
}
可以看到,在这个构造函数中,Handle首先获取了当前线程的Looper对象,如果当前线程没有Looper对象,则会抛出一个RuntimeException异常。接着,Handle将这个Looper对象中的消息队列赋值给了Handle的mQueue变量。然后,Handle还保存了一个回调接口对象mCallback和一个标志位mAsynchronous。
接下来,我们来看一下Handle中最重要的方法之一,sendMessage()方法:
public final boolean sendMessage(Message msg) {
return sendMessageDelayed(msg, 0);
}
public boolean sendMessageDelayed(Message msg, long delayMillis) {
if (delayMillis < 0) {
delayMillis = 0;
}
return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}
public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
MessageQueue queue = mQueue;
if (queue == null) {
RuntimeException e = new RuntimeException(
this + " sendMessageAtTime() called with no mQueue");
Log.w("Handle", e.getMessage(), e);
return false;
}
return enqueueMessage(queue, msg, uptimeMillis);
}
可以看到,sendMessage()方法实际上是调用了sendMessageDelayed()方法,并将delayMillis参数设置为0。sendMessageDelayed()方法中,Handle会根据delayMillis参数计算出消息的到达时间,然后调用sendMessageAtTime()方法将消息加入消息队列中。最后,sendMessageAtTime()方法会调用enqueueMessage()方法将消息插入到消息队列中。
接下来,我们来看一下enqueueMessage()方法的实现:
boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
msg.target = this;
if (mAsynchronous) {
msg.setAsynchronous(true);
}
return queue.enqueueMessage(msg, uptimeMillis);
}
可以看到,enqueueMessage()方法首先将消息的目标对象设置为当前的Handle对象,然后如果Handle被标记为异步处理,则将消息的异步处理标志位设置为true。最后,enqueueMessage()方法调用了MessageQueue的enqueueMessage()方法将消息插入到消息队列中。
最后,我们来看一下Handle中另一个重要的方法,handleMessage()方法:
public void handleMessage(Message msg) {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMesssage(msg);
}
protected void handleMesssage(Message msg) {
}
可以看到,handleMessage()方法首先判断是否设置了回调接口mCallback,如果设置了,则调用回调接口的handleMessage()方法处理消息。如果回调接口处理了消息,则直接返回,否则调用Handle自己的handleMesssage()方法处理消息。
总结一下,安卓中的Handle类是用于实现线程之间通信的一种机制,它的实现依赖于Looper和MessageQueue。当一个线程需要向另一个线程发送消息时,它可以创建一个Handle对象,并将消息通过Handle对象发送到目标线程的消息队列中。当目标线程的Looper对象从消息队列中取出消息后,会将消息交给Handle对象处理。Handle对象会根据消息的类型和内容,调用自己的handleMessage()方法或回调接口的handleMessage()方法来处理消息。
网友评论