Android之Fragment懶加載

luodan 8年前發布 | 8K 次閱讀 安卓開發 Android開發 移動開發

還記得以前使用ViewPager+Fragment時根本不考慮效率問題,一股腦的多頁數據加載導致卡死,還自我安慰說我設置了setOffscreenPageLimit了啊,而實際上跟蹤源碼我們發現DEFAULT_OFFSCREEN_PAGES = 1,所以即便setOffscreenPageLimit我設置為0,ViewPager最少也會加載后一頁。為了保證效率現在都提倡一種懶加載的機制,即只有當前頁面為顯示頁面才會加載且只加載一次數據(做一次耗時操作:或網絡請求或本地數據)。有同學說我可以拷貝源碼把默認改為0啊,是可以這么做,但是改變了viewpager的初衷,不夠靈活。在實際項目中我還是建議改造BaseFragment,利用setUserVisibleHint,暴露數據加載的方法,根據需要重載懶加載方法做實際操作。

下面來看具體的改造方法:

1.設定兩個標識

private boolean isViewPrepared; // 標識fragment視圖已經初始化完畢
private boolean hasFetchData; // 標識已經觸發過懶加載數據

2.創建懶加載的數據加載方法

/**  懶加載的方式獲取數據,僅在滿足fragment可見和視圖已經準備好的時候調用一次 */
protected void lazyFetchData() {    
Log.v(TAG, getClass().getName() + "------>lazyFetchData");
}

3.以上兩個標識值的判定:

  • 在onViewCreated方法中(即表明視圖已經準備完畢)isViewPrepared = true;
  • 在onDestroyView方法中(view被銷毀后,將可以重新觸發數據懶加載,因為在viewpager下,fragment不會再次新建并走onCreate的生命周期流程,將從onCreateView開始)hasFetchData = false; isViewPrepared = false;

4.判定是否需要加載數據

private void lazyFetchDataIfPrepared() {    
// 用戶可見fragment && 沒有加載過數據 && 視圖已經準備完畢    
if (getUserVisibleHint() && !hasFetchData && isViewPrepared) {  
      hasFetchData = true; //已加載過數據
      lazyFetchData();    
      }
}

5.lazyFetchDataIfPrepared方法的調用時機

  • onViewCreated方法中調用lazyFetchDataIfPrepared方法,此時只有首頁會符合條件
  • setUserVisibleHint
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {  
      super.setUserVisibleHint(isVisibleToUser);    
      Log.v(TAG, getClass().getName() + "------>isVisibleToUser = " +               isVisibleToUser);   
     if (isVisibleToUser) {//當當前為顯示頁面時
          lazyFetchDataIfPrepared();   
     }
    }

6.子類Fragment根據需要重載lazyFetchData方法(訪問網絡加載數據)

@Override
protected void lazyFetchData() {    
  ((DiscoverPresenter) mPresenter).getData();
}

整個改造就算結束了,是不是很簡單,為了讓你的fragment不那么累趕緊試試吧(如果還有不懂可以參照源碼)。

 

 

來自:http://www.jianshu.com/p/fccc7716f47e

 

 本文由用戶 luodan 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!