Android 懶加載簡單介紹


1.懶加載介紹

1.1.效果預覽

  

 

 

1.2.效果講解

  當頁面可見的時候,才加載當前頁面。

  沒有打開的頁面,就不會預加載。

  說白了,懶加載就是可見的時候才去請求數據。

 

 

1.3.懶加載文章傳送門

  參考文章:Android懶加載。

  參考文章:Android開發技巧-懶加載。

 

 

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的生命周期圖解吧。

  




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM