Handler是什么
- 想必每一个做安卓开发的人都知道Handler,就是线程间通信的桥梁,那么他的本质是什么呢,说白了就是内存共享。
Handler的是如何实现内存共享的
- 这就要说到
Message消息
,说到消息就需要说到MessageQueue消息队列
,那么有了消息和消息队列,肯定少不了Looper消息泵
,最后如何运行起来呢,就用到了Looper.loop()消息泵的开关
,好了到这里Handler基本就明了了。
从源码理解Handler
- 我们用
Handler
发送消息都是通过sendMessage()
或者post()
方法,最后调用的都是enqueueMessage
方法。
Handler内存共享如何保证数据的安全
- 这里就要说到一个新的角色
ThreadLocal
,ThreadLocal中有一个静态内部类ThreadLocalMap
,他为每个线程都维护一个table数组
,其中通过int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
和int i = key.threadLocalHashCode & (len-1);
产生一个ThreadId作为key,value就是我们发出的消息。
如果对ThreadLocal感兴趣可以看看这篇文章
ThreadLocal
Handler如何存取消息
-
MessageQueue.enqueueMessage()
向消息队列添加消息,MessageQueue.next()
从消息队列里取消息。 - 由此可以看出使用了生产者消费者模式,并且还有延迟消息的添加, 就像链表一样在给消息进行重排序。
网友评论