1.懶加載介紹
1.1.效果預覽

1.2.效果講解
當頁面可見的時候,才加載當前頁面。
沒有打開的頁面,就不會預加載。
說白了,懶加載就是可見的時候才去請求數據。
1.3.懶加載文章傳送門
1.4.懶加載的意義以及使用原因
我們在使用viiewpage與多個Fragment組合使用的時候,如果每個fragment都需要加載數據,或從本地加載,
或從網絡加載,那么在這個activity剛創建的時候就需要初始化大量資源。
viewpager默認一次加載當前頁面前后兩個頁面,即使設置setofflimit(0)也沒有效果,這就是預加載。
這樣把我們看不到的頁面的數據也加載了,大大降低了性能,浪費初始化資源。
如果我們采用懶加載技術,只讓用戶看到的頁面才會加載需要的數據,這樣也更加人性化,也大大提高效率。
2.使用懶加載的方法
2.1.按照每個人的需求可能不一樣,但是核心是一樣的。
那就是這個setUserVisibleHint函數。
@Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); //執行邏輯代碼 }
這個函數的作用就是:
當fragment被用戶可見時,setUserVisibleHint()會調用且傳入true值,
當fragment不被用戶可見時,setUserVisibleHint()則得到false值。
而在傳統的fragment生命周期里也看不到這個函數。
可以參考這篇文章:Fragment的setUserVisibleHint詳解。
2.2.簡單的一個案例==>當Fragment可見的時候執行一個抽象函數來加載數據。
public abstract class LazyLoadFragment extends BaseFragment { protected boolean isViewInitiated;//判斷視圖是否初始化 protected boolean isVisibleToUser;//用戶是否可見 protected boolean isDataInitiated;//數據是否初始化 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); isViewInitiated = true; prepareFetchData(); } //在所有生命周期函數之前調用,查看是否可見 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); this.isVisibleToUser = isVisibleToUser; prepareFetchData(); } //定義一個抽象函數,在子類中實現,作用就是加載初始化數據 public abstract void fetchData(); //准備加載數據,這里不是強制刷新 public boolean prepareFetchData() { return prepareFetchData(false); } //用戶強制刷新的話,就應該是用戶主動進行刷新了,當然也要去取數據了,用戶第一嘛 public boolean prepareFetchData(boolean forceUpdate) { if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) { fetchData(); isDataInitiated = true; return true; } return false; } }
解釋一下:這個BaseFragment就是最基礎的基類了,里面進行一些最底層的設置,定義抽象函數:
比如布局文件的綁定,初始化視圖控件,初始化數據,初始化Toolbar
所以這個懶加載LazyLoadFragment基本上是隔離開了。
耦合度相當低,基本都可以這樣使用吧。
3.總結一下吧
3.1.viewpager監聽切換tab事件,tab切換一次,執行一次setUserVisibleHint方法。
3.2.setUserVisibleHint()在fragmetn所有生命周期之前,無論viewpager是在activity哪個生命周期里初始化的。
3.3.activity生命周期和fragment生命周期時序並不是按序來的,因為執行速度很快,嗖的一下就執行完了。
所以fragment的onCreate方法時序並不一定在activity的onCreate方法之后。
這就是為什么我調試的時候,編譯器老是不按照常理的順序來,一下子跳這兒,一下那兒的。
3.4.最后看一下Activity和Fragment的生命周期圖解吧。

