一、简介
Handler作为Android线程间通信的常用方式,主要由Handler、Looper、MessageQueue、message四个部分组成 ,
Handler
负责线程间消息通讯的发送消息和接收处理消息Looper
用于从MessageQueue中轮询获得MessageMessageQueue
则是一个单线链表的用于存储Message的数据结构Message
则是线程间通信的载体
总体流程图如下
简单使用,如下子线程发送message,主线程更新UI
private Handler handler=new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message message) {
//主线程更新UI
return true;
}
});
new Thread(new Runnable() {
@Override
public void run() {
//子线程发送消息
handler.sendEmptyMessage(1);
//发送Runnable本质也是发送message,Runnable被赋值给Message.callback
handler.post(runnable);
}
}).start();
二、源码分析
2.1、Handler
先从Handler构造函数开始
public Handler(@Nullable Callback callback, boolean async) {
...
mLooper = Looper.myLooper();
if (mLooper == null) {
throw new RuntimeException(
"Can't create handler inside thread " + Thread.currentThread()
+ " that has not called Looper.prepare()");
}
mQueue = mLooper.mQueue;
mCallback = callback;
mAsynchronous = async;
}
public static @Nullable Looper myLooper() {
return sThreadLocal.get();
}
先是通过Looper.myLooper()
获得Looper对象,Looper对象是在Looper.prepare()
时创建的,但是这里我们并没有调用prepare(),是因为一开始在ActivityThread
的main
方法中调用了Looper.prepareMainLooper()
已经初始化了Looper
public static void main(String[] args) {
...
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
thread.attach(false, startSeq);
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, "ActivityThread"));
}
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
public static void prepareMainLooper() {
prepare(false);
synchronized (Looper.class)