1. 程式人生 > >Android在切換Fragment過程中,如何避免重新載入

Android在切換Fragment過程中,如何避免重新載入

這是公司的新專案,MainActivity中是集合了多個Fragment,同時,Fragment 中又用ViewPager 嵌套了多個Fragment

所以在MainActivity中,為了避免滑動衝突,通過FragManager 進行Fragment 的切換操作

但是,同時也產生了一個問題。這裡先賣個關子,我們先看下Frament的生命週期圖

這是一張很常見的週期圖,選自網路。

現在,我把相關的日誌打印出來。



接著,我試圖切換下Fragment ,同樣,打印出相對應的日誌


可以看出,在第二個Fragment Create之後,第一個Fragment 就根據生命週期的流程被銷燬了

最後,我們再切回第一個Fragment


所執行的順序和第一個Fragment 切換到第二個Fragment 的流程是一樣的。

於是問題就來了,如果我們Fragment 中可能包含需要非同步載入或者呼叫快取等操作的時候。

需要按照生命週期重新進行Fragment 進行載入,這無論是對於時間還是流量開銷都是比較大的。

現在,我們就來解決這個問題。

------------------------------------------------------------------------------------------------------------------------華麗的分割線------------------------------------------------------------------------------------------

解決方案: 在Activity 中新增該方法

//宣告一個Fragment
 private Fragment mFrag;
//建立用於存放Fragment的集合
<span style="color:#000080;">private List<Fragment> frags = new ArrayList<>();</span>
//進行Fragment 載入的方法,position 是Activity 中選中Fragment在Tab中的序號
 private void loadFragment(int position) {

//從集合中獲取相對序號的Fragment 
       Fragment f = frags.get(position);
        fragmentTransaction = fragmentManager.beginTransaction();
//首先判斷mFrag 是否為空,如果不為,先隱藏起來,接著判斷從List 獲取的Fragment是否已經新增到Transaction中,如果未新增,新增後顯示,如果已經新增,直接顯示
 if(mFrag != null) {
            fragmentTransaction.hide(mFrag);
        }
        if(!f.isAdded()) {
            fragmentTransaction.add(R.id.flMain, f);

        } else {
            fragmentTransaction.show(f);
        }
//將獲取的Fragment 賦值給宣告的Fragment 中,提交
 mFrag = f;
        fragmentTransaction.commit();

    }

呼叫該方法後,重新執行程式,同樣的,列印日誌,檢視結果

跳轉到第一個Fragment 時打印出的日誌


接著,跳轉到第二個Fragment


忽略那條JSON資料,可以看出,建立第二個Fragment 時只是按生命週期建立了第二個Fragment ,然而第一個Fragment 並沒有被銷燬

為了證明該方法確實有用,我們把Fragment 再切換回第一個Fragment

很好,Logcat並未顯示有關Fragment 宣告週期的日誌,這說明在切換到一個已建立的Fragment 後,不再重新啟動一個相關的生命週期,這節約了載入的時間和流量

ps:可以把該方法寫入到基類中,封裝後可重複使用,沒必要重複造輪子。