从头再看Handler

178 阅读1分钟

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()从消息队列里取消息。
  • 由此可以看出使用了生产者消费者模式,并且还有延迟消息的添加, 就像链表一样在给消息进行重排序。

今天就先写到这明天继续😂未完待续下期见!