android中很多地方都能看到消息处理的代码,其实现主要借助looper和handler来完成。
在类looper的注释中,有最基础的消息处理使用方法:
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
looper
looper中有个消息队列mQueue,保存了待处理的消息
// sThreadLocal.get() will return null unless you've called prepare().
static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();
private static Looper sMainLooper; // guarded by Looper.class
//消息队列,用来保存消息
final MessageQueue mQueue;
//保存looper调用线程的信息
final Thread mThread;
Handler
Handler主要就是向looper的消息队列中添加消息和处理消息的,Handler有好几个构造函数,可以传入Looper looper, Callback callback等,即Handler可以处理其他线程的looper,而且还可以输入特定的消息处理callback函数。
而Handler对消息的处理,是由下面函数完成:
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
如果msg有callback函数,调用该函数处理消息;
如果调用Handler带callback的构造函数,则利用该callback函数处理消息;
如果上面两个都没有,则会调用handleMessage()处理消息,这也就是在最开始时候类looper中提供的简单例子所实现的一样,子类继承Handler类,并重写handleMessage()方法进行特定需要的消息处理。