Handler
android必答题之一Handler机制以及相关的连锁问题探究
前言
Handler作为Android中一个重要的机制帮助android的应用程序得以正常的使用,让我们来揭秘他的神秘面纱。
一、Handler是什么?
Handler是什么,可能很多小伙伴一下子还回答不出来,可能让你回答Handler是怎么运行的你还可能会知道说它是同msg的收发维护事件的正常运行的。然而Handler到底是什么,其实从广义来讲Handler就是处理消息的机制,在代码上讲Handler不就是一个类,它的功能就是送入你要处理的消息,以及处理消息。
二、Handler机制
想要理解Handler机制不得不提到他们一系列干活的好兄弟Message、Looper、MessageQueue、thread。
从图中我们能知道这些兄弟都去干什么事情,他们各司其职干活明确,才能顺利的把message传递和接收处理。
?三、Handler问题
1.一个线程有几个handler?有几个looper?如何保证?
对于handler来说我们可以new多个对象,但是每个线程只有一个looper,为什么?因为每个线程在自己的传输带上工作才不会被其他线程打扰工作,要不快递员是不是会崩溃呢。因为串货了前期的分类就乱套了,后续工作也就白做了。那他们是如何实现的呢,这时候就要引入一个新成员那就是ThreadLocal ,这位仁兄的作用就是记录当前线程的looper的Key,通过ThreadLocal获取到线程的looper。
static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();
private static void prepare(boolean quitAllowed) {
if (sThreadLocal.get() != null) {
throw new RuntimeException("Only one Looper may be created per thread");
}
sThreadLocal.set(new Looper(quitAllowed));
}
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
这是从代码预备方法中我们也可以看到,当sThreadLocal有值的时候就不创建新的looper了,所以一个线程也只有一个looper,也保证了它的唯一性。
2.为什么在主线程能直接new Handler?
?在ActivityThread这个类里面我们不难发现在应用开始就启动了主线程的looper已经初始化并开启了loop
public static void main(String[] args) {
//...
Looper.prepareMainLooper();
//...
Looper.loop();
//...
}
public static void prepareMainLooper() {
prepare(false);
synchronized (Looper.class) {
if (sMainLooper != null) {
throw new IllegalStateException("The main Looper has already been prepared.");
}
sMainLooper = myLooper();
}
}
总结
带着问题去看代码寻找答案有时候可能会更加事半功倍吧
|