Android消息机制
- Android消息机制主要指Handle的运行机制
- MessageQueue和Looper支撑Handle运行
- MessageQueue是单链表结构
- Looper无线循环查找消息队列是否有新消息,如果有则处理,否者一直等待
- Handle创建在哪个线程就会使用当前那个线程的Looper,由FrameWork源码可知。
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;
}
Handle 持有Looper和MessageQueue引用
Looper 持有MessageQueue和ThreadLocal,Thread引用
-
ThreadLocal
为每个线程提供一个变量的独立的变量副本,所以每个线程只会独立的改变自己的副本,而不会影响其他对应的副本。
如何实现变量的副本的
实现很简单
ThreadLocal内部维护一个Map,用于存储每一个线程变量副本,Map中的键为线程对象,值就是对应线程的变量副本。
解决多线程并发问题