懶加載---原理分析

懶加載的本意就是敷搪,讓界面顯示的時候再去加載數(shù)據(jù)。
對于Fragment來說留量,他的onCreateView()方法被執(zhí)行了窄赋,界面才會出來。

ViewPager+Fragment模式

我們一般的做法是這樣的

onCreate(){  
    mViewPager.setAdapter((new FragmentStatePagerAdapter(...));
    mViewPager.setCurrentItem(1);
}

在這里楼熄,要稍微的解釋下忆绰,這兩個方法究竟在ViewPager中做了什么。
剛學Android經(jīng)常犯一個錯誤孝赫,就是在onCreate()方法中去拿某個View的寬高较木,比如,在這里mViewPager.getWidth()肯定為0青柄,那么為什么為0呢?一般的解釋是此時整個View樹還沒有完成測量预侯、布局的操作致开。那么View樹的第一次測量布局究竟是什么時候執(zhí)行的呢?

為了解釋我這個困惑萎馅,嘗試著在onResume()中去拿到ViewPager的寬高双戳,不出所料,肯定還是0糜芳。

View樹的第一次測量布局

在ActivityThread的handleResumeActivity()中飒货,在之前的onCreate()中魄衅,整個View樹的數(shù)據(jù)已經(jīng)創(chuàng)建出來,但是還沒有顯示出來塘辅,所以晃虫,在這里,執(zhí)行一個IPC操作扣墩,將View樹添加到WMS中哲银,那么在客戶端進程中的流程是ViewRootImpl的setView()--->requestLayout(),該方法發(fā)送一個scheduleTraversals()的異步任務呻惕,注意荆责,也就是是說,當Activity的onResume()方法執(zhí)行時亚脆,只是發(fā)送了一個異步的scheduleTraversals任務到UI隊列中去做院,要等到下一次UI線程處理隊列中的這個任務時,才會執(zhí)行濒持。所以键耕,在onResume()中也無法拿到寬高。

setAdapter()方法

經(jīng)過上面的分析弥喉,也就是說setAdapter()執(zhí)行的時候郁竟,界面還沒有出來。

public void setAdapter(...){
//......
            if(!wasFirstLayout) {      //是否是第一次布局由境,默認為true棚亩,當onLayout執(zhí)行后賦值為false,所以這里會執(zhí)行requestLayout()方法虏杰,發(fā)送一個異步布局消息讥蟆。
                populate();
            } else {
                requestLayout();
            }
}

假設后面我們執(zhí)行了setCurrentItem(1)方法,同樣

public void setCurrentItem(){
       if (mFirstLayout) {      //此時為true
            // We don't have any idea how big we are yet and shouldn't have any pages either.
            // Just set things up and let the pending layout handle things.
            mCurItem = item;
          // ......
            requestLayout();
        } else {
            populate(item);
            scrollToItem(item, smoothScroll, velocity, dispatchSelected);
        }
}

這里會執(zhí)行if中的代碼纺阔,也就是該方法確定了mCurItem,也就是界面顯示的時候究竟顯示哪一個瘸彤,此時是1。然后笛钝,也是發(fā)送了一個異步布局消息质况。

測量布局
onMeasure()方法

 // Make sure we have created all fragments that we need to have shown.
        mInLayout = true;
        populate();  //根據(jù)適配器提供的數(shù)據(jù),創(chuàng)建出相關數(shù)據(jù)玻靡,便于后面的繪制
        mInLayout = false;

        // Page views next.
        size = getChildCount();    //當populate方法執(zhí)行完后结榄,子孩子已經(jīng)被添加到ViewPager中去

setUserVisibleHint()什么時候執(zhí)行

populate()--->addItem--->mAdapter.instantiateItem()--->setUserVisibleHint(false)

void populate(){
        
        //根據(jù)pageOffsize等參數(shù)算出mCurItem,也就是當前顯示界面的位置囤捻,默認為0臼朗,然后將0-mCurItem之間的Fragment全部初始化出來,addItem()方法不斷調(diào)用(此時還沒有去創(chuàng)建Fragment對象,只是內(nèi)部保存了一個ItemInfo的數(shù)組信息)
        //設置要顯示的那個item,要顯示的Fragment的setUserVisibleHint方法被調(diào)用
        mAdapter.setPrimaryItem(this, mCurItem, curItem != null ? curItem.object : null);
        //執(zhí)行創(chuàng)建Fragment的操作视哑,由FragmentPageAdapter實現(xiàn)
        mAdapter.finishUpdate(this);
}

也就是當?shù)谝淮未_定要顯示哪一個Fragment的時候绣否,其實Fragment這個對象還并沒有創(chuàng)建出來。那么懶加載在Fragment中應該考慮到這一點挡毅。

    /**
     * 進行懶加載
     */
    private void lazyFetchDataIfPrepared() {
        // 用戶可見fragment && 沒有加載過數(shù)據(jù) && 視圖已經(jīng)準備完畢
        if (getUserVisibleHint() && !hasFetchData && isViewPrepared) {
            hasFetchData = true;
            lazyFetchData();
        }
    }
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒜撮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子慷嗜,更是在濱河造成了極大的恐慌淀弹,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庆械,死亡現(xiàn)場離奇詭異薇溃,居然都是意外死亡,警方通過查閱死者的電腦和手機缭乘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門沐序,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人堕绩,你說我怎么就攤上這事策幼。” “怎么了奴紧?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵特姐,是天一觀的道長。 經(jīng)常有香客問我黍氮,道長唐含,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任沫浆,我火速辦了婚禮捷枯,結果婚禮上,老公的妹妹穿的比我還像新娘专执。我一直安慰自己淮捆,他們只是感情好,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布本股。 她就那樣靜靜地躺著攀痊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拄显。 梳的紋絲不亂的頭發(fā)上蚕苇,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機與錄音凿叠,去河邊找鬼。 笑死,一個胖子當著我的面吹牛盒件,可吹牛的內(nèi)容都是我干的蹬碧。 我是一名探鬼主播佳吞,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼吗购,長吁一口氣:“原來是場噩夢啊……” “哼任连!你這毒婦竟也來了虐拓?” 一聲冷哼從身側響起铛绰,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤碟婆,失蹤者是張志新(化名)和其女友劉穎拄踪,沒想到半個月后含思,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體城瞎,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡渤闷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了脖镀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片飒箭。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蜒灰,靈堂內(nèi)的尸體忽然破棺而出弦蹂,到底是詐尸還是另有隱情,我是刑警寧澤强窖,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布凸椿,位于F島的核電站,受9級特大地震影響翅溺,放射性物質發(fā)生泄漏脑漫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一未巫、第九天 我趴在偏房一處隱蔽的房頂上張望窿撬。 院中可真熱鬧,春花似錦叙凡、人聲如沸劈伴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跛璧。三九已至,卻和暖如春新啼,著一層夾襖步出監(jiān)牢的瞬間追城,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工燥撞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留座柱,地道東北人迷帜。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像色洞,于是被迫代替她去往敵國和親戏锹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容