Handler原理讲解
主要是讲解(记录)此前看到的Handle如何做线程切换原理
Handler涉及类
Handler、线程、Looper、MessageQueue关系
-
一个线程只有一个Looper和一个MessageQueue
-
子线程创建Handler对象时需要传入Looper,如果是将消息发送到主线程的话
-
每个Handler都会关联一个消息队列,消息队列被封装在Looper中,而每个Looper又会关联一个线程(Looper通过ThreadLocal封装)。最终就等于每个消息队列都会关联一个线程
Looper是轮询器,不断轮询MessageQueue,取出Message,如果有Message,就取出,并交予Handler处理。需要注意的是线程与Looper和MessageQueue是一一对应的
解析
Handler创建
平时使用Handler大概是这样:
//在主线程中创建Handler并使用
Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
loadData();
}
});
//在子线程创建Handler并使用
Handler handler = new Handler();
handler.post(new Runnable(getMainLooper()) {
@Override
public void run() {
loadData();
}
});
如上所示,(都是将消息发送到主线程中处理)如果在子线程中创建Handler,比在子线程中创建Handler不一样的是仅仅在创建Handler对象时使用的构造器不一样:在子线程中传入了Looper对象(来自getMainLooper())。查看Handler构造器:
public Handler() {
this(null, false);
}
public Handler(Callback callback, boolean async) {
if (FIND_POTENTIAL_LEAKS) {
FIND_POTENTIAL_LEAKS一直都会是false,不需要关心该控制语句
...省略
}
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;
}
public Handler(Looper looper) {
this(looper, null, false);
}
public Handler(Looper looper, Callback callback, boolean async) {
mLooper = looper;
mQueue = looper.mQueue;
mCallback = callback;
mAsynchronous = async;
}