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的問題慢慢研究以待後續