fragment 懶加載,新聞內容頁類的多個fragment的優化

fragment 懶加載,新聞內容頁類的多個fragment的優化

1.目標

1.fragment切換時只加載當前fragment不預加載前後的fragment
2.從當前fragment切出去時及時回收,節省內存

2.方案

1.setUserVisibleHint(boolean isVisibleToUser)
    該方法獲取當前fragment是否對用戶可見:
        true:如果可見獲取數據
        false:如果不可見,釋放內存
    **但是要注意**:
        1.當fragment切出去時,isVisibleToUser=false
        會被調用兩次。
        2.isVisibleToUser=true,在oncreate之前,
        也就是view並未初始化
    **結論**:
        1.也就是說我們只要在isVisibleToUser=true&&view初始化之後
        獲取數據就可以實現懶加載
    **但是有坑**:
        1.view初始化後的操作不要放到onViewCreated()裏
            因爲並不一定會被調用,這個方法不是fragment生命週期裏的,
            到是onActivityCreated是一定會被調用的
        2.getUserVisibleHint()方法獲取到的結果竟然經常時不正確的
        明明顯示了卻返回false,
        所以自己定義一個成員變量同步setUserVisibleHint的參數就好
        原因需要在查

3.代碼

 
private boolean isInit = false;
private boolean isVisible = false;

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    //在fragment可見時在加載數據,以防viewpager與加載fragment造成卡頓,
    //但第一個fragment不會進入判斷所以單獨處理
    isVisible = isVisibleToUser;
    if (!isVisibleToUser){
        listData.clear();
    }
    //並沒有被銷燬時會走這裏獲取數據
    isCanLoadData();
}

 @Override
public void onActivityCreated(@android.support.annotation.Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    isInit = true;
    isCanLoadData();
}

public void onDestroyView() {
    super.onDestroyView();
    isInit = false;
}
private void isCanLoadData(){
    if (isInit&& isVisible &&listData.isEmpty()){
       //自己加載數據的地方
    }
}

4.後記

這篇筆記只解決了懶加載的問題,沒有解決控制viewpager加載幾個fragment的問題慢慢研究以待後續
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章