美文网首页
RecyclerView回收原理分析

RecyclerView回收原理分析

作者: 吕志豪 | 来源:发表于2017-11-30 13:33 被阅读0次

http://blog.csdn.net/boboyuwu/article/details/77148302
首先分析的入口

removeAndRecycleView

        /**
         * Remove a child view and recycle it using the given Recycler.
         *
         * @param child Child to remove and recycle
         * @param recycler Recycler to use to recycle child
         */
        public void removeAndRecycleView(View child, Recycler recycler) {
            removeView(child);
            recycler.recycleView(child);
        }

recycler.recycleView(child);

        public void recycleView(View view) {
            ......
            recycleViewHolderInternal(holder);
        }

recycleViewHolderInternal mViewCacheMax=2

        void recycleViewHolderInternal(ViewHolder holder) {
                    ......
                    int cachedViewSize = mCachedViews.size();
                    if (cachedViewSize >= mViewCacheMax && cachedViewSize > 0) {
                        recycleCachedViewAt(0);
                        cachedViewSize--;
                    }
                    ......
        }

recycleCachedViewAt

        void recycleCachedViewAt(int cachedViewIndex) {
            ......
            addViewHolderToRecycledViewPool(viewHolder, true);
            mCachedViews.remove(cachedViewIndex);
        }

addViewHolderToRecycledViewPool

        void addViewHolderToRecycledViewPool(ViewHolder holder, boolean dispatchRecycled) {
            ......
            getRecycledViewPool().putRecycledView(holder);
        }

putRecycledView mMaxScrap=5

        public void putRecycledView(ViewHolder scrap) {
            final int viewType = scrap.getItemViewType();
            final ArrayList<ViewHolder> scrapHeap = getScrapDataForType(viewType).mScrapHeap;
            if (mScrap.get(viewType).mMaxScrap <= scrapHeap.size()) {
                return;
            }
           ......
            scrapHeap.add(scrap);
        }

以上为recyclerview对滑出的子view进行的大致操作

关注点:

  1. 容器有两种
  • ArrayList<ViewHolder> mCachedViews
  • SparseArray<ScrapData> mScrap
        static class ScrapData {
            ArrayList<ViewHolder> mScrapHeap = new ArrayList<>();
            int mMaxScrap = DEFAULT_MAX_SCRAP;//5
            long mCreateRunningAverageNs = 0;
            long mBindRunningAverageNs = 0;
        }
        SparseArray<ScrapData> mScrap = new SparseArray<>();

2 .移除的view流程,首先进入mCachedViews,

  • 当mCachedViews容器装满之后,
  • 按照FIFO(先进先出)规则出栈,
  • 然后根据类型进入mScrap的mScrapHeap中,
  • 当该类型的mScrapHeap容器装满之后,任由该view自生自灭

相关文章

网友评论

      本文标题: RecyclerView回收原理分析

      本文链接:https://www.haomeiwen.com/subject/trjvbxtx.html