AndroidX對ViewPager懶加載的影響及解決方案

本文主要是講解遷移到AndroidX之后恩闻,對原本的ViewPager懶加載造成的影響赞赖,和如何進行優(yōu)化栏尚。參考的項目來自

波瀾步驚 的文章 《手把手講解 ViewPager懶加載》

最后的代碼修改對比也是來自大神的文章到逊,建議先看一下再過來看本文

一吮便、為什么要遷移為AndroidX

根據(jù)官方說明骆姐,AndroidX是對原始Android支持庫(android.support.*)進行了重大改進和統(tǒng)一管理镜粤,舊的庫依然能用,但是新庫的開發(fā)都將會在AndroidX中進行玻褪,所以建議還是遷移到AndroidX肉渴。

image-20191106141427918.png

具體如何遷移,本文在此不做詳細說明带射,請查看官方文檔

二同规、遷移之后的區(qū)別

遷移之后出現(xiàn)問題,主要是因為FragmentPagerAdapter的文件有所改動

1 初始化

舊版:

image-20191106143344778.png

新版:


image-20191106143525127.png

可以看到初始化的方式添加了一個@Deprecated (廢棄)的注解窟社,就是告訴大家不要用這種方式進行初始化了券勺。那么應(yīng)該怎么進行初始化呢?

image-20191106144016864.png

這里就可以看到灿里,初始化的時候关炼,除了需要傳入fm,同時還需要傳一個behavior匣吊,讓我們來看看Behavior具體是哪些值儒拂?

image-20191106144411441.png

根據(jù)注釋可以知道

當behavior == BEHAVIOR_SET_USER_VISIBLE_HINT 時,F(xiàn)ragment切換時色鸳,會觸發(fā)setUserVisibleHint社痛。
這個效果和\color{#00ffff}{舊版}的效果一樣,也就是說命雀,如果你不想修改原來懶加載的邏輯蒜哀,只需要這么寫

FragmentPagerAdapter adapter = new FragmentPagerAdapter(fm);
或者
FragmentPagerAdapter adapter = new FragmentPagerAdapter(fm, BEHAVIOR_SET_USER_VISIBLE_HINT);

但是,我們看到了BEHAVIOR_SET_USER_VISIBLE_HINT也被標識了@Deprecated (廢棄)咏雌,建議我們使用BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT凡怎。所以\color{#00ffff}{新版本}初始化方式是:

FragmentPagerAdapter adapter = new FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);

而這時候會用到生命周期狀態(tài)標識Lifecycle.State校焦。

2 FragmentPageAdapter初始化Fragment

@NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        //...省略非重點代碼 
        if (mBehavior == BEHAVIOR_SET_USER_VISIBLE_HINT) {
            //舊版本,觸發(fā)setUserVisibleHint
            fragment.setUserVisibleHint(false);
        }

        mFragments.set(position, fragment);
        //關(guān)鍵句,添加Fragment進入事物list
        mCurTransaction.add(container.getId(), fragment);

        if (mBehavior == BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
            //AndroidX,設(shè)置初始化執(zhí)行到onStart()就停止了
            mCurTransaction.setMaxLifecycle(fragment, Lifecycle.State.STARTED);
        }

        return fragment;
    }

追蹤進入mCurTransaction.add(container.getId(), fragment);方法

image-20191106161227079.png
 void doAddOp(int containerViewId, Fragment fragment, @Nullable String tag, int opcmd) {
    //...省略非重點代碼
     addOp(new Op(opcmd, fragment));
 }
image-20191106161358476.png

添加的是一個Op對象赊抖,看看Op是如何初始化的统倒。

Op(int cmd, Fragment fragment) {
            this.mCmd = cmd;
            this.mFragment = fragment;
            //初始化執(zhí)行到onResume()
            this.mOldMaxState = Lifecycle.State.RESUMED;
            this.mCurrentMaxState = Lifecycle.State.RESUMED;
        }

到這里,我們就能明白了如果是舊版本氛雪,F(xiàn)ragment初始化的時候房匆,默認會執(zhí)行到onResume(),而AndroidX只會執(zhí)行到onStart()报亩,所以我們遷移到AndroidX之后浴鸿,不需要全都依靠setUserVisibleHint()來判斷當前頁面是否顯示,我們可以根據(jù)onResume()來判斷弦追。

3 遷移到AndroidX之后岳链,BaseFragment相應(yīng)的修改

@Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        mRoot = inflater.inflate(getLayoutId(), container, false);
        Log.d(getLifeCycleTag(), "onCreateView");
        initView(mRoot);
        //在View創(chuàng)建完畢之后,isViewCreate 要變?yōu)閠rue
        isViewCreated = true;
        //下面2段代碼可以刪除
        //if (!isHidden() && getUserVisibleHint())
            //dispatchVisibleState(true);
        return mRoot;
    }

@Override
    public void onResume() {
        super.onResume();
        Log.d(getLifeCycleTag(), "onResume");
       /* 舊版本
        if (!isFirstVisible) {
            if (!isHidden() && !currentVisibleState && getUserVisibleHint())
                dispatchVisibleState(true);
        }
        */
        //新版本
        if (!isHidden() && !currentVisibleState && isResumed()) {
            dispatchVisibleState(true);
        }
    }

@Override
    public void onPause() {
        MobclickAgent.onPageEnd(this.getClass().getName());
        super.onPause();
        Log.d(tag,"onPause: ");
        /* 舊版本
        if (currentVisibleState && !isResumed()) {
            dispatchVisibleState(false);
        }
        */
        //新版本
        if (currentVisibleState && !isResumed()) {
            dispatchVisibleState(false);
        }
    }
//其他不需要更改

三劲件、總結(jié)

遷移到AndroidX掸哑,主要改變的是FragmentPagerAdapter對Fragment的初始化方式進行了優(yōu)化,所以才需要進行這樣修改零远,其實問題不難苗分,順著邏輯看一下源碼就能發(fā)現(xiàn)區(qū)別啦。希望對大家有所幫助牵辣,如果文章有不足之處摔癣,請不吝指出,謝謝纬向。

四择浊、鳴謝

感謝 波瀾步驚 的文章 《手把手講解 ViewPager懶加載》ViewPager懶加載寫得很詳細,易懂逾条。

感謝 享學課堂 avlin老師 提供的demo 以及視頻

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末近她,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子膳帕,更是在濱河造成了極大的恐慌粘捎,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件危彩,死亡現(xiàn)場離奇詭異攒磨,居然都是意外死亡,警方通過查閱死者的電腦和手機汤徽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門娩缰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谒府,你說我怎么就攤上這事拼坎「√海” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵泰鸡,是天一觀的道長债蓝。 經(jīng)常有香客問我,道長盛龄,這世上最難降的妖魔是什么饰迹? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮余舶,結(jié)果婚禮上啊鸭,老公的妹妹穿的比我還像新娘。我一直安慰自己匿值,他們只是感情好赠制,可當我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著挟憔,像睡著了一般钟些。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上曲楚,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天厘唾,我揣著相機與錄音,去河邊找鬼龙誊。 笑死抚垃,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的趟大。 我是一名探鬼主播鹤树,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逊朽!你這毒婦竟也來了罕伯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤叽讳,失蹤者是張志新(化名)和其女友劉穎追他,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岛蚤,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡邑狸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了涤妒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片单雾。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出硅堆,到底是詐尸還是另有隱情屿储,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布渐逃,位于F島的核電站够掠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏朴乖。R本人自食惡果不足惜祖屏,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一助赞、第九天 我趴在偏房一處隱蔽的房頂上張望买羞。 院中可真熱鬧,春花似錦雹食、人聲如沸畜普。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吃挑。三九已至,卻和暖如春街立,著一層夾襖步出監(jiān)牢的瞬間舶衬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工赎离, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留逛犹,地道東北人。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓梁剔,卻偏偏與公主長得像虽画,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子荣病,可洞房花燭夜當晚...
    茶點故事閱讀 45,781評論 2 361