Handler的post方法是将一个Runnable对象投递到与此Handler关联的消息队列中,代码如下:
//freameworks/base/core/java/android/os/Handler.java
public class Handler {
public final boolean post(@NonNull Runnable r) {
return sendMessageDelayed(getPostMessage(r), 0);
}
}
上面的主要处理如下:
1、调用Handler的getPostMessage方法,通过Runnable获取对应的Message。
2、调用Handler的sendMessageDelayed方法,发送这个Message。
下面分别进行分析:
Handler的getPostMessage
通过getPostMessage取得Runnable 对应的Message :
//freameworks/base/core/java/android/os/Handler.java
public class Handler {
private static Message getPostMessage(Runnable r) {
Message m = Message.obtain();
m.callback = r;
return m;
}
}
调用Message的obtain方法获取一个Message对象:
//freameworks/base/core/java/android/os/Message.java
public final class Message implements Parcelable {}
private static Message sPool;
private static int sPoolSize = 0;
public static Message obtain() { //从全局的Message池中获取一个Message对象,如果池中没有可用的对象,则新建一个Message对象
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();
}
}
new Message
创建Message对象,Message的构造方法如下:
//freameworks/base/core/java/android/os/Message.java
public final class Message implements Parcelable {
public Message() {
}
}
1、Message类持有一个sPool静态变量,它永远指向一个单链表的头引用,该sPool组成的单链表用于在内存中缓存使用过的Message对象,可以节省内存空间、可以节省创建对象的开销(这要单独开一篇源码分析文章)
2、所有需要传入参数的静态方法obtain()的内部均调用了无参数的静态方法obtain(),无参数的静态方法obtain()会从Message消息池中取出一个Message对象
3、不要使用new的方式创建Message对象,因为系统帮我们缓存了一批Message对象!(内存缓存)
Handler sendMessageDelayed
这部分与Handler的sendMessage流程一致