Handler源码学习(一)流程
Handler源码学习(二)Message对象池
Handler源码学习(三)MessageQueue入队插队
消息池是全系统共用,上限为50个
|
|
上面的过程只有一个mesage,详细解释一下sPool和next,将sPool看成一个指针,通过next来将对象组成了一个链表,因为每次只需要从池子里拿一个对象,所以不需要关心池子里具体有多少个对象,而是拿出当前这个sPool所指向的这个对象就可以了,sPool从思路上理解就是通过左右移动来完成复用和回收
Obtain() – 复用
当调用Obtain()的时候让sPool=next,因为第一个message.next就等于第二个message,从图上看相当于sPool这个指针向后移动了一位,随后会将第一个message.next的值置为空
如下图
现在这个链表看上去就断了,如果in-use这个message使用完毕了,怎么回到链表中?
recycleUnchecked() – 回收
再看回收的方法中的代码,next = sPool,将当前sPool所指向的message对象赋值给in-use的next,然后sPool = this,将sPool指向第一个message对象
这样,就将链表又恢复了~,而且不管是复用还是回收都是保证线程同步的,所以始终会形成一条链式结构