天天看點

Fragment懶加載(一)

用多viewpager+fragment的朋友都知道viewpager有預加載機制,如果你每個頁面都有請求網絡的操作,那麼隻顯示第一個頁面就去加載完所有頁面的網絡資料也不好。那怎麼辦呢,有的朋友說那就不用viewpager,那更不行,物品就是因為Viewpager有緩存機制才用它的。于是我們換種思路,在fragment上動手腳,是以就有了懶加載這個說法。

其實懶加載的核心來自與fragment中的一個方法setUserVisibleHint,這個方法隻有在從隐藏到顯示和從顯示到隐藏才會調用,而getUserVisibleHint()這個方法能傳回顯示/隐藏狀态。

之前我在網上找了一些别人寫的,很多都寫得看着不是很好,但是我找到了一個寫得挺不錯的,比較符合viewpager+fragment這種情況。

public abstract class BaseLazyFragment extends BaseFragment {
/**
 * 懶加載過
 */
private boolean isLazyLoaded;

private boolean isPrepared;

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    isPrepared = true;
    //隻有Fragment onCreateView好了,
    //另外這裡調用一次lazyLoad()
    lazyLoad();
}

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    lazyLoad();
}

/**
 * 調用懶加載
 */

private void lazyLoad() {
    if (getUserVisibleHint() && isPrepared && !isLazyLoaded) {
        onLazyLoad();
        isLazyLoaded = true;
    }
}

@UiThread
public abstract void onLazyLoad();
}
           

這是他寫的代碼,要判斷是否請求網絡資料有三個條件,是否第一次加載,是否是顯示狀态和基本元件是否已經初始化完成。

他的寫法和我所想的思路一樣,那我就不再花時間自己封一個,就用這個代碼來講。

首先肯定隻有第一次顯示才請求網絡吧,之後再顯示都不請求,是以要在第一次請求網絡之後吧isLazyLoaded變為true。

然後對于第一個頁面來說,setUserVisibleHint是在onActivityCreated方法之前,是以要在onActivityCreated方法中再進行一次請求網絡的操作。

這樣講應該能明白這段代碼的意思。其實做法有很多種,不一定要這樣寫,但是思路我覺得就是這樣。

繼續閱讀