RecyclerView(4)- 核心源碼解析嗅绰、Recycler復用機制

先來點廢話
這周有點蛋疼,本來是打算前幾天就開始錄制相關視頻搀继,編寫相關博客的窘面,因為工作上的原因導致原本的計劃推遲了,很無奈律歼。
周三領導突然叫我開會 民镜,我要與兩個同事弄個微信公眾號系統(tǒng)(包括后臺與前端)

領導:“下周你們要開始進入xxxx項目 大概 xxx時間完成 啡专,A與B我會叫他們和你一塊做”
我:“領導险毁,你看時間是不是有點短,之前我們都沒有接觸過wx這塊,而且你看a同學又剛剛畢業(yè)畔况,你看著 是不是得多預留些時間”
領導:“這個功能很簡單的啦鲸鹦,我相信你們” ;
我:“技術上可能問題不大跷跪,都比較有經(jīng)驗馋嗜,但你看涉及的系統(tǒng) ERP,用戶系統(tǒng)、訂單系統(tǒng)什么的 就有6吵瞻、7個葛菇,業(yè)務上是不是需要花個一周給我們培訓下”
領導:“邊做邊了解業(yè)務嘛”
我:**** “操你大爺,你行你來”(心里大吼橡羞,我慫)
領導:“這個功能很簡單眯停,怎么實現(xiàn)我不管”

苦逼的開會,了解wx的公眾號 開發(fā)中心 各種信息卿泽,對接其他系統(tǒng)莺债、碰需求,接口 签夭,開發(fā)計劃



上一節(jié)RecyclerView(3)- LayoutMagager源碼解析,LinearLayoutManager 大概了解了一些 layoutManager的一些方法齐邦,以及LinearLayoutManager的布局方式,這一節(jié)才是真正的recyclerView的核心第租,recycler復用機制措拇。

通過本文你會知道

1、recylerView 存取view的一個流程
2慎宾、結合上一章RecyclerView(3)- LayoutMagager源碼解析,LinearLayoutManage你會感嘆 “哇 儡羔,原來如此” 到 “哦,原來是這樣”
3璧诵、可以知道其中輔助類非常多汰蜘,且很有意義,職責分離之宿,重復代碼的一個優(yōu)雅的封裝 族操、命名規(guī)范。

本文就不一步一步帶大家去看了比被,

先來一些基礎概念色难,也是分析過程當中的一些總結,看完之后 再去看源碼 會簡單輕松很多等缀,然后在配合視頻來看 那最好不過了枷莉。

1、view: layoutPararms內保存了 viewHolder
2尺迂、viewHolder.mNestedRecyclerView保存了 復類 recyclerView
3笤妙、Recycler 內有幾個List<Holder> 作為緩存使用 分別是: mChangedScrap冒掌、mAttachedScrap、mCachedViews 且默認最大數(shù)量為2
4蹲盘、ViewInfoStore保存了一些動畫信息
5股毫、RecycledViewPool 內有 SparseArray<ScrapData>、viewType , 而SrapData內有 ArrayList<ViewHolder> mScrapHeap 且默認最大數(shù)量為5 也就是說每種viewType的的ViewHolder最多緩存5個召衔。

回收得源碼大概是這樣的:

    回收: recycler.recycleView(view);
        ViewHolder holder = getChildViewHolderInt(view);
        removeDetachedView(view, false);
             if (holder.isScrap()) {
                   holder.unScrap();
               } else if (holder.wasReturnedFromScrap()){
                  holder.clearReturnedFromScrapFlag();
               }
            recycleViewHolderInternal(holder);


    getChildViewHolderInt
         ((LayoutParams) child.getLayoutParams()).mViewHolder;
    removeDetachedView
         dispatchChildDetached(child);
            onChildDetachedFromWindow(child);
         //暫時沒有做回收相關的動作
            
         super.removeDetachedView(child, animate)
            //如果有動畫  執(zhí)行移除動畫 LayoutTransition.removeChild(this, child);
            //移除焦點
            dispatchViewRemoved(child);
                onViewRemoved(child);
    holder.unScrap();
        從recycler的  廢料池mChangedScrap :list<ViewHodler>  中移除
          或者 從recycler的  廢料池mAttachedScrap  :list<ViewHodler>  中移除
        viewHolder清除recycler的引用 清除標志铃诬;
    
    holder.clearReturnedFromScrapFlag
        清除標志
    recycleViewHolderInternal
        判斷cacheView內的數(shù)量 如果超過最大 那么  移除第一個  
              recycleCachedViewAt(0);
                  addViewHolderToRecycledViewPool(viewHolder, true);
                    clearNestedRecyclerViewIfNotNested(holder);  //將viewHolder引用的recyclerView移除掉
                        dispatchViewRecycled(holder);
                        監(jiān)聽移除、mViewInfoStore.removeViewHolder(holder);
                        getRecycledViewPool().putRecycledView(holder);
                        //加入廢料池

                  //從mCachedViews移除掉第0個
              mCachedViews.add(targetCacheIndex, holder); //添加到合適的位置
              mViewInfoStore.removeViewHolder(holder);

調用的簡化代碼在這里:


    獲炔粤荨: recycler.getViewForPosition(mCurrentPosition);
           ViewHolder tryGetViewHolderForPositionByDeadline(int position,
                boolean dryRun, long deadlineNs) {
              //如果 mState.isPreLayout()
            holder = getChangedScrapViewForPosition(position);      //本質 mChangedScrap中獲取
              //if (holder == null) {
             holder = getScrapOrHiddenOrCachedHolderForPosition(position, dryRun);  //本質 從 mAttachedScrap獲取 或者從 mCachedViews中獲取
              //if (holder != null) {
                     if (!validateViewHolderForOffsetPosition(holder)) {
               //從緩存當中移除view
              //if (holder == null && mViewCacheExtension != null)
                final View view = mViewCacheExtension
                            .getViewForPositionAndType(this, position, type);
                 // 通過view 拿到viewHolder
              
              //if (holder == null) { // fallback to pool
              holder = getRecycledViewPool().getRecycledView(type);
                if (holder != null) {
    `                           holder.resetInternal();
                      // if (holder == null) {
                holder = mAdapter.createViewHolder(RecyclerView.this, type);
                    從adapter內取出 holder  將 recyclerVIew的引用 設置進viewHoler
                //初始化 viewType廢料列表與記錄 oncreateViewHoler的一個時間  mRecyclerPool.factorInCreateTime(type, end - start);
              viewholer.mPreLayoutPosition =postion;
              測量layoutParams
            return viewHolder;

總結起來是這樣的


回收

本文從 view的獲取與銷毀為切入點出發(fā)趣席,來過了一遍 淺顯的解析了一遍 view的回收、復用的過程醇蝴。
詳細請看:
文章視頻地址:鏈接:http://pan.baidu.com/s/1hssvXC4 密碼:18v1

· RecyclerView(1)- Decoration源碼解析
· RecyclerView(2)- 自定義Decoration打造時光軸效果
· RecyclerView(3)- LayoutMagager源碼解析,LinearLayoutManager
· RecyclerView(4)- 核心吩坝、Recycler復用機制_1
· RecyclerView(4)- 核心、Recycler復用機制_2
· RecyclerView(5)- 自定義LayoutManager(布局哑蔫、復用)
· RecyclerView(6)- 自定義ItemAnimator
· RecyclerView(7)- ItemTouchHelper
· RecyclerView(8)- MultiTypeAdapter文章钉寝、MultiTypeAdapter Github地址


希望我的文章不會誤導在觀看的你,如果有異議的地方歡迎討論和指正闸迷。
如果能給觀看的你帶來收獲嵌纲,那就是最好不過了。

人生得意須盡歡, 桃花塢里桃花庵
點個關注唄腥沽,對逮走,不信你點試試?
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末今阳,一起剝皮案震驚了整個濱河市师溅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盾舌,老刑警劉巖墓臭,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異妖谴,居然都是意外死亡窿锉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門膝舅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嗡载,“玉大人,你說我怎么就攤上這事仍稀⊥莨觯” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵技潘,是天一觀的道長遥巴。 經(jīng)常有香客問我千康,道長,這世上最難降的妖魔是什么挪哄? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任吧秕,我火速辦了婚禮琉闪,結果婚禮上迹炼,老公的妹妹穿的比我還像新娘。我一直安慰自己颠毙,他們只是感情好斯入,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蛀蜜,像睡著了一般刻两。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上滴某,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天磅摹,我揣著相機與錄音,去河邊找鬼霎奢。 笑死户誓,一個胖子當著我的面吹牛,可吹牛的內容都是我干的幕侠。 我是一名探鬼主播帝美,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晤硕!你這毒婦竟也來了悼潭?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤舞箍,失蹤者是張志新(化名)和其女友劉穎舰褪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疏橄,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡抵知,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了软族。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刷喜。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖立砸,靈堂內的尸體忽然破棺而出掖疮,到底是詐尸還是另有隱情,我是刑警寧澤颗祝,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布浊闪,位于F島的核電站恼布,受9級特大地震影響,放射性物質發(fā)生泄漏搁宾。R本人自食惡果不足惜折汞,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盖腿。 院中可真熱鬧爽待,春花似錦、人聲如沸翩腐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茂卦。三九已至何什,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間等龙,已是汗流浹背处渣。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蛛砰,地道東北人罐栈。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像暴备,于是被迫代替她去往敵國和親悠瞬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內容

  • 本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家發(fā)布 最近在研究 RecyclerView 的回收復...
    請叫我大蘇閱讀 15,484評論 40 138
  • 這篇文章分三個部分涯捻,簡單跟大家講一下 RecyclerView 的常用方法與奇葩用法浅妆;工作原理與ListView比...
    LucasAdam閱讀 4,391評論 0 27
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,162評論 25 707
  • 能力就是會把一個問題拆解為一個個小問題凌外,然后針對小問題進行解決,有些是自己能解決的涛浙,如果有不能解決的康辑,也能知道找到...
    羅菱閱讀 227評論 0 0
  • 李健的歌初聽給人的印象就是安靜,空靈。他的歌與那種極富個性與節(jié)奏的歌曲形成鮮明的對比,其歌曲伴奏有時體現(xiàn)出濃濃的俄...
    AnriquejoanChou閱讀 808評論 0 0