主要分析一下Handler,Message,MessageQueue,Looper的源码。
Handler
Handler可以发送和处理Message,Runnable对象(Message,Runnable都是与此Handler所绑定的Thread的MessageQueue相关);每个Handler对象只能绑定一个Thread,一个Thread都只有一个MessageQueue.当你创建了一个handler对象,它将与当前的Thread绑定,从那时起,它将可以发送Massage和Runnable给这个Thread的MessageQueue,当前这些Message和Runnable从MessageQueue取出时,Handler将处理这些Message和Runnable。
Handler主要有两个作用:1,延迟或者定时执行一些任务;2,处理别的线程发送过来的一些消息或者Runnable。
Handler一些常用方法:
post(Runnable),postAtTime(Runnable, long),postDelayed(Runnable,long).
sendEmptyMessage(),sendMessage(Message), sendMessageAtTime(Message,long),sendMessageDelayed(Message,long).
当你的app打开之后,会创建进程,然后它的主线程会运行一个messageQueue来管理一些顶级的应用组件(activity,broadcast,etc)和所有的它创建的窗口。你可以创建子线程,通过Handler与主线程进行通信。
Handler的构造方法有很多,参数从0个到三个都行,最终调用的构造方法如下:
public Handler(Looper looper, Callback callback, boolean async) {
mLooper = looper;
mQueue = looper.mQueue;
mCallback = callback;
mAsynchronous = async;
}
Callback如下:
public interface Callback {
public boolean handleMessage(Message msg);
}
从构造方法可以看出,Handler分为同步和异步,与Handler相关的有Looper,MessageQueue,Message
再看Handler的obtainMessage方法:
public final Message obtainMessage()
{
return Message.obtain(this);
}
其实是调用Message的obtain方法:
public static Message obtain() {
synchronized (sPoolSync) {
if (sPool != null) {
Message m = sPool;
sPool = m.next;
m.next = null;
m.flags = 0; // clear in-use flag
sPoolSize--;
return m;
}
}
return new Message();
}
意思就是从Message的消息池中取出最上面的消息。(关于Message会在后面分析到)
sendMessage系列方法:
其实对于这一系列所有的send和post方法,最终调用的都是MessageQueue的enqueueMessage(msg,uptimeMillis)方法,作用就是插入一条消息到MessageQueue,uptimeMillis代表的是延时执行,如果send或者post方法没有设置延时,则uptimeMillis为0;post方法发送的是一个Runnable对象,其实还是封装成了一个Message发送过去,代码如下:
private static Message getPostMessage(Runnable r) {
Message m = Message.obtain();
m.callback = r;
return m;
}
消息的分发:
handler收到消息后会进行判断,然后处理消息,其判断过程如下:
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
private static void handleCallback(Message message) {
message.callback.run();
}
首先会判断Message有没有runnable对象,如果有,则直接执行runnable对象的run()方法,如果没有,则执行handleMessage()方法,handleMessage()是在创建handler对象的时候应该重写的方法,来完成具体的操作。
本篇主要介绍一下handler中常用的一些方法的原理,关于handler的工作过程,Looper,MessageQueue将会在下篇讲到。