ViewGroup的TouchTarget设计思维

TouchTarget需要创建的时候先看下池子里面有没有被回收上来的,如果没有可以利用的就给你创建一个新的,否则就从池子里面把头部的那个可以利用的给你,你把你的东西放进去就行了。回收的时候就是把你放在池子的头部,并清空你里面的东西,防止你重复的回收(一次就好)

  public static TouchTarget obtain(@NonNull View child, int pointerIdBits) {
            if (child == null) {
                throw new IllegalArgumentException("child must be non-null");
            }

            final TouchTarget target;
            synchronized (sRecycleLock) {
                //链表的头部为空说明池子里面没有被回收上来的touchTagget对象,那么就直接创建,只要你需要就满足你
                if (sRecycleBin == null) {
                    target = new TouchTarget();
                } else {
                    //从池子里面去拿出来,做一个链表的减员操作
                    target = sRecycleBin;
                    sRecycleBin = target.next;
                     sRecycledCount--;
                    target.next = null;
                }
            }
            //填充好你自己的东西就好了
            target.child = child;
            target.pointerIdBits = pointerIdBits;
            return target;
        }


   public void recycle() {
           //回收一次后就会把child置空,再次回收就给你报错
            if (child == null) {
                throw new IllegalStateException("already recycled once");
            }

            synchronized (sRecycleLock) {
                if (sRecycledCount < MAX_RECYCLED) {
                    //池子放的下话就把你放在链表的头部,做一个链表的插入操作
                    next = sRecycleBin;
                    sRecycleBin = this;
                    sRecycledCount += 1;
                } else {
                    //回收池已经满了,你自己被跟我们关联了,处于游离状态等待垃圾回收吧
                    next = null;
                }
                //把自己的东西置空
                child = null;
            }
        }

 

posted @ 2022-04-13 11:30  lianzhen  阅读(37)  评论(0编辑  收藏  举报