Handler 允许你发送和处理消息或者跟线程相关的Runable对象。每一个Handler实例被一个单线程以及线程的消息队列关联。当你创建一个新的Handler的时候,它被绑定到创建它的线程以及对应的消息队列。从这一点讲它们传递消息和runables到消息队列并且处理它们当它们从消息队列中出来的时候。
Handler有两个作用:
(1)调度消息和runable使其在以后某个时间点被执行
(2)在不同的线程上插入action并执行
Handler发送消息相关的函数有:
post(Runnable),
postAtTime(Runnable, long),
postDelayed(Runnable, long),
sendEmptyMessage(int),
sendMessage(Message),
sendMessageAtTime(Message, long),
sendMessageDelayed(Message, long)
当你传递消息的时候,你可以让消息立即得到处理或者指定延迟的时间或者执行的时间,后面两种允许你完成timeouts, ticks, 以及其它 timing-based behavior
当一个进程被你的app创建的时候,主线程专门运行一个消息队列来管理顶层的app对象(activities, broadcast receivers, etc)以及任何它创建的窗口。你可以创建自己的线程并且用Handler和主线程通信。这些可以通过在你的新线程中通过调用post或者sendMessage函数来实现。给出的message或者runable将会在适合的时机在Handler的message队列中被调度。
1 数据成员
final MessageQueue mQueue;
final Looper mLooper;
final Callback mCallback;
final boolean mAsynchronous;
IMessenger mMessenger;
2 一些重要的函数或者接口
2.1
public interface Callback {
public boolean handleMessage(Message msg);
}
当用此实例化一个Handler对象时候就不必要用子类继承Handler了
2.2
public void handleMessage(Message msg) {
}
子类必须实现这个函数来接受消息。
2.3
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
这个用来处理消息,可以在Looper中的消息循环中看到这个函数被调用
2.4
构造函数中重要的一个
public Handler(Callback callback, boolean async) {
if (FIND_POTENTIAL_LEAKS) {
final Class<? extends Handler> klass = getClass();
if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
(klass.getModifiers() & Modifier.STATIC) == 0) {
Log.w(TAG, "The following Handler class should be static or leaks might occur: " +
klass.getCanonicalName());
}
}
mLooper = Looper.myLooper();
if (mLooper == null) {
throw new RuntimeException(
"Can't create handler inside thread that has not called Looper.prepare()");
}
mQueue = mLooper.mQueue;
mCallback = callback;
mAsynchronous = async;
}
这个构造函数是很多Handler的构造函数都会调用的构造函数,从中可以看出,handler的成员mQueue,mLooper都是通过Looper.myLooper()函数获取的,从Looper的代码分析可以知道Looper对象是和创建它的对象一对一的关系,那么这里的Handler自然也就和创建它的对象相关了,必然的消息队列也是相关的了。(前提是构造函数中没有指定Looper)
public String getMessageName(Message message)
public final Message obtainMessage()
参考文献:
http://android.toolib.net/reference/android/os/Handler.html
http://www.cnblogs.com/codingmyworld/archive/2011/09/14/2174255.html
安卓源码