Handler简介:
一个Handler和线程,消息队列关联起来,允许你发送,处理,Message和Runnable。每个Handler实例和单独的线程,消息队列关联,当你创建一个新的handler,它就绑定到了消息队列(当前线程),它将传递Message和Runnable,执行它们当Message和Runnable从消息队列中出来的时候。
其主要有2种用途;1:在未来执行一个Message或者runnable。2:将一个需要执行的action从一个不用的线程中放入一个队列中。
当应用进程被创建的时候,在activities, broadcast receivers, etc(任何window被创建)中就有了消息队列。你可以在自己的thread(子线程)中创建,通过handler可以和主线程关联起来。通过post,sendMessage来实现。
sendMessage可以携带bundle,需要实现handler来完成。
主要方法介绍:
1:子类必须实现的方法
public void handleMessage(Message msg) {}
2:处理消息
/**
* Handle system messages here.
*/
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
3:系列方法obtainMessage,都是调用了Message的同名方法。
public final Message obtainMessage(int what, int arg1, int arg2, Object obj)
{
return Message.obtain(this, what, arg1, arg2, obj);
}
public static Message obtain(Handler h, int what,
int arg1, int arg2, Object obj) {
Message m = obtain();
m.target = h;
m.what = what;
m.arg1 = arg1;
m.arg2 = arg2;
m.obj = obj;
return m;
}
4:系列方法post
public final boolean postDelayed(Runnable r, long delayMillis)
{
return sendMessageDelayed(getPostMessage(r), delayMillis);
}
private static Message getPostMessage(Runnable r) {
Message m = Message.obtain();
m.callback = r;
return m;
}
可以看出,post也是通过Message来实现的。将runnable,obj封装成Message。
5:系列方法send
无论是sendEmptyMessage还是sendMessageDelayed,都是执行了sendMessageAtTime方法。
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("Looper", e.getMessage(), e);
return false;
}
return enqueueMessage(queue, msg, uptimeMillis);
}
private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
msg.target = this;
if (mAsynchronous) {
msg.setAsynchronous(true);
}
return queue.enqueueMessage(msg, uptimeMillis);
}
6:在activity的onDestory中执行removeCallbacksAndMessages方法,参数为null,移除所有的callback及message。
Message简介:
Message可以包含int字段,object,callback,通过handler来传递数据。尽管Message的方法是public的,可是最好的方法是通过Message.obtain(),或者Handler.obtainMessage()。因为这个是从一个可以被回收利用的pool中获取的。
message也可以发送Message。其实,还是通过handler来完成的。
public void sendToTarget() {
target.sendMessage(this);
}
总结:
到最后,都是获取MessageQueue然后执行enqueueMessage方法来实现的。无论是send,post,或者message的send,是否有延迟的。