1. 程式人生 > >Android 懶載入簡單介紹

Android 懶載入簡單介紹

轉載自:https://www.cnblogs.com/Jason-Jan/p/8018500.html

目錄

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