Android之Fragment懶加載
還記得以前使用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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!