Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> android fragment生命周期應用

android fragment生命周期應用

編輯:關於android開發

android fragment生命周期應用


問題描述
很多時候我們使用fragment都是在viewpager裡面嵌套fragment,或者activity下面一個選擇標簽,在一個container裡面添加要切換的幾個fragment,這個時候各個fragment之間的切換,他們的生命周期怎樣變化呢,下面我們一起來研究下。 解決方案
fragment嵌套在viewpager裡面
這裡寫圖片描述

這個demo是我在csdn上面down下來的,這裡貼出原作者。(http://blog.csdn.net/u013758734/article/details/29848117)

我們在四個fragment裡面各個生命周期方法都添加日志輸出。

當第一次打開demo我們查看日志輸出
這裡寫圖片描述
我們發現OneFragment和TwoFragment的五個生命周期方法依次執行。理解:因為viewpager實際會把左右兩頁都緩存好,默認緩存2頁。而此時TwoFragment實際已經准備好了,只是在屏幕的右側未出現而已。 當我們由OneFragment滑倒TwoFragment
這裡寫圖片描述
我們發現ThreeFragment走了5個生命周期方法,而OneFragment沒有變化。理解:viewpager會把左右兩頁緩存好,所以OneFragment沒有變化,只是加載了ThreeFragment。 當我們由TwoFragment滑倒ThreeFragment
這裡寫圖片描述
我們發現OneFragment先被銷毀,然後FourFragment被加載。理解:viewpager會把左右兩頁緩存好,當在第三頁的時候,那麼只緩存了第二頁和第四頁。

看了這三個應該可以知道又ThreeFragment滑倒FourFragment怎麼變化的吧,TwoFragment會被銷毀。

總結:viewpager默認會把左右兩頁緩存好,那麼已經緩存好了的生命周期都是一樣的,而且生命周期都會在同一個狀態。

既然默認viewpager是緩存兩頁,那肯定有設置緩存頁數的方法啊,就是:

mViewPager.setOffscreenPageLimit(3);

這裡有4頁,那麼需要緩存3頁。當設置了這個方法,我們再看看,進入demo:
這裡寫圖片描述
我們會發現,FourFragment也直接緩存好了,這和理論是一致的,至於什麼周期的順序大家可以自己理解。然而無論這4頁怎麼滑,生命周期都沒變化,那麼這裡又衍生了一個問題,當我進入第一頁的時候,就把其他幾頁都加載了,這樣一下就加載很多資源,怎麼優化這個問題呢。這個我們下面再討論。我們先看看這個viewpager被activity遮擋,退出時候變化。

當按了home鍵,畫著被其他的activity(不包括dialog,activitydialog)遮擋
這裡寫圖片描述
理解:這種情況下其生命周期隨著activity一起變化,而且所有的fragment的生命周期一致。 重新進入demo
這裡寫圖片描述 退出demo
這裡寫圖片描述

上面講了這麼多,分析了viewpager嵌套fragment其生命周期變化,當我們設置了setOffscreenPageLimit(3)這之後,進入這個viewpager,所有的fragment都會全部進入onresume狀態,相當於將所有的數據一下加載完畢,當我們有很多頁或者很多數據時,對應用的負擔很大,怎樣處理這個問題呢。
fragment為我們提供了setUserVisibleHint(boolean isVisibleToUser)方法

我們在每個fragment裡面添加這個方法,如

 @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        if (isVisibleToUser) {
            Log.i("TAG", "OneFragment--setUserVisibleHint");
        }
        super.setUserVisibleHint(isVisibleToUser);
    }

當我們進入demo時
這裡寫圖片描述
發現第一個執行的就是setUserVisibleHint方法,理解:這個方法是當fragment出現在屏幕時,isVisibleToUser參數才會置true,所以我們是不是可以很好的利用這個方法呢,我們可以在這個方法裡面寫加載數據的方法

依次進入其他幾個fragment,其setUserVisibleHint方法會被依次執行
這裡寫圖片描述

總結:遇到viewpager裡面嵌套fragment時候,setUserVisibleHint和setOffscreenPageLimit方法可以配合著使用,這樣最大化的優化這個模塊。

以上講的是viewpager裡面嵌套fragment的時候,當在一個container裡面添加要切換的幾個fragment,這個時候各個fragment之間的切換,這個時候生命周期怎樣變化呢,我們先貼一段在一個container裡面設置幾個fragment的寫法的代碼。

FragmentTransaction transaction = fragmentManager.beginTransaction();
        hideFragments(transaction);
        switch (index) {
        case 2:         
            if (myInfoFragment == null) {
                myInfoFragment = new MyInfoFragment();
                transaction.add(R.id.content, myInfoFragment);
            } else {
                transaction.show(myInfoFragment);
            }
            break;
        case 0:
            if (pharmacistFragment == null) {
                pharmacistFragment = new PharmacistFragment();
                transaction.add(R.id.content, pharmacistFragment);
            } else {
                transaction.show(pharmacistFragment);
            }
            break;
        case 1:
            if (findFragment == null) {
                findFragment = new FindFragment();
                transaction.add(R.id.content, findFragment);
            } else {
                transaction.show(findFragment);
            }
            break;
        default:

            break;
        }
        transaction.commit();

這樣寫法和viewpager嵌套fragment的生命周期差不多,唯一區別就是,當進入第一頁的時候,默認不會一下就把其他兩頁緩存好(當然你也可以這樣寫),當進入其他兩頁,緩存好了後,其生命周期變化就完全一致了,所有的fragment的生命周期都在一個狀態。當然,也要配置著setUserVisibleHint方法使用,優化這個模塊。具體的demo演示,我就不做了,大家可以自己動手。

有什麼疑問歡迎留言
付源碼http://download.csdn.net/detail/xiangxi101/9490794

/**
* --------------
* 歡迎轉載 | 轉載請注明
* --------------
* 如果對你有幫助,請點擊|頂|
* --------------
* 請保持謙遜 | 你會走的更遠
* --------------
* @author css
* @github https://github.com/songsongbrother
* @blog http://blog.csdn.net/xiangxi101
*/

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved