android预加载布局,Android 懒加载优化
目錄介紹
1.什么是懶加載
1.1 什么是預加載
1.2 懶加載介紹
1.3 懶加載概括
2.實際應用中有哪些懶加載案例
2.1 ViewPager+Fragment組合
2.2 分析源碼
3.ViewPager中setOffscreenPageLimit(int limit)相關源碼
4.關于ViewPager與Fragment懶加載
4.1 遇到的問題
4.2 主要的思路做法
4.3 代碼案例展示
4.4 onLazyLoad()加載數據條件
4.5 Fragment的方法setUserVisibleHint
5.懶加載Fragment為什么要繼承BaseFragment
0.前言介紹
1.什么是懶加載
1.1 什么是預加載
ViewPager+Fragment的搭配在日常開發中也比較常見,可用于切換展示不同類別的頁面,我們日常所見的咨詢、購物、金融、社交等類型的APP都有機會用到這種控件組合
ViewPager控件有個特有的預加載機制,即默認情況下當前頁面左右兩側的1個頁面會被加載,以方便用戶滑動切換到相鄰的界面時,可以更加順暢的顯示出來。
通過ViewPager的setOffscreenPageLimit(int limit)可以設置預加載頁面數量,當前頁面相鄰的limit個頁面會被預加載進內存
1.2 懶加載介紹
懶加載,其實也就是延遲加載,就是等到該頁面的UI展示給用戶時,再加載該頁面的數據(從網絡、數據庫等),而不是依靠ViewPager預加載機制提前加載兩三個,甚至更多頁面的數據。這樣可以提高所屬Activity的初始化速度,也可以為用戶節省流量.而這種懶加載的方式也已經/正在被諸多APP所采用。
但是通過ViewPager方法setOffscreenPageLimit(int limit)的源碼可以發現,ViewPager通過一定的邏輯判斷來確保至少會預加載左右兩側相鄰的1個頁面,也就是說無法通過簡單的配置做到懶加載的效果。
1.3 懶加載概括
當頁面可見的時候,才加載當前頁面。
沒有打開的頁面,就不會預加載。
說白了,懶加載就是可見的時候才去請求數據。
2.實際應用中有哪些懶加載案例
1.1 ViewPager+Fragment的搭配使用懶加載
1.2 H5網頁使用懶加載
3.ViewPager中setOffscreenPageLimit(int limit)相關源碼
3.1 源碼如下所示
//默認的緩存頁面數量(常量)
private static final int DEFAULT_OFFSCREEN_PAGES = 1;
//緩存頁面數量(變量)
private int mOffscreenPageLimit = DEFAULT_OFFSCREEN_PAGES;
public void setOffscreenPageLimit(int limit) {
//當我們手動設置的limit數小于默認值1時,limit值會自動被賦值為默認值1(即DEFAULT_OFFSCREEN_PAGES)
if (limit < DEFAULT_OFFSCREEN_PAGES) {
Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to "+ DEFAULT_OFFSCREEN_PAGES);
limit = DEFAULT_OFFSCREEN_PAGES;
}
if (limit != mOffscreenPageLimit) {
//經過前面的攔截判斷后,將limit的值設置給mOffscreenPageLimit,用于
mOffscreenPageLimit = limit;
populate();
}
}
3.2 分析源碼可知
ViewPager通過一定的邏輯判斷來確保至少會預加載左右兩側相鄰的1個頁面,也就是說無法通過簡單的配置做到懶加載的效果。
4.關于ViewPager與Fragment懶加載
4.1 遇到的問題
在使用viewpager(或其他容器)與多個Fragment來組合使用,ViewPager 會默認一次加載當前頁面前后隔一個頁面,即使設置setofflimit(0)也無效果,也會預加載。這樣把我們看不到的頁面的數據也加載了,大大降低了性能,浪費初始化資源。然而我們就采用懶加載技術,只讓用戶看到的頁面才會加載他的數據,大大提高效率。
4.2 主要的思路做法
主要的方法是Fragment中的setUserVisibleHint(),此方法會在onCreateView()之前執行,當viewPager中fragment改變可見狀態時也會調用,當fragment 從可見到不見,或者從不可見切換到可見,都會調用此方法,使用getUserVisibleHint() 可以返回fragment是否可見狀態。
在BaseMVPLazyFragment中需要在onActivityCreated()及setUserVisibleHint()方法中都調了一次lazyLoad() 方法。如果僅僅在setUserVisibleHint()調用lazyLoad(),當默認首頁首先加載時會導致viewPager的首頁第一次展示時沒有數據顯示,切換一下才會有數據。因為首頁fragment的setUserVisible()在onActivityCreated() 之前調用,此時isPrepared為false 導致首頁fragment 沒能調用onLazyLoad()方法加載數據。
4.3 代碼案例展示
public abstract class BaseMVPLazyFragment extends BaseMVPFragment {
/**
* Fragment的View加載完畢的標記
*/
protected boolean isViewInitiated;
/**
* Fragment對用戶可見的標記
*/
protected boolean isVisibleToUser;
/**
* 是否懶加載
*/
protected boolean isDataInitiated;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
/**
* 第一步,改變isViewInitiated標記
* 當onViewCreated()方法執行時,表明View已經加載完畢,此時改變isViewInitiated標記為true,并調用lazyLoad()方法
*/
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
isViewInitiated = true;
//只有Fragment onCreateView好了,
//另外這里調用一次lazyLoad()
prepareFetchData();
//lazyLoad();
}
/**
* 第二步
* 此方法會在onCreateView()之前執行
* 當viewPager中fragment改變可見狀態時也會調用
* 當fragment 從可見到不見,或者從不可見切換到可見,都會調用此方法
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
this.isVisibleToUser = isVisibleToUser;
prepareFetchData();
}
/**
* 第四步:定義抽象方法fetchData(),具體加載數據的工作,交給子類去完成
*/
public abstract void fetchData();
/**
* 第三步:在lazyLoad()方法中進行雙重標記判斷,通過后即可進行數據加載
* 第一種方法
* 調用懶加載,getUserVisibleHint()會返回是否可見狀態
* 這是fragment實現懶加載的關鍵,只有fragment 可見才會調用onLazyLoad() 加載數據
*/
private void lazyLoad() {
if (getUserVisibleHint() && isViewInitiated && !isDataInitiated) {
fetchData();
isDataInitiated = true;
}
}
/**
* 第二種方法
* 調用懶加載
*/
public void prepareFetchData() {
prepareFetchData(false);
}
/**
* 第三步:在lazyLoad()方法中進行雙重標記判斷,通過后即可進行數據加載
*/
public void prepareFetchData(boolean forceUpdate) {
if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) {
fetchData();
isDataInitiated = true;
}
}
}
4.4 onLazyLoad()加載數據條件
getUserVisibleHint()會返回是否可見狀態,這是fragment實現懶加載的關鍵,只有fragment 可見才會調用onLazyLoad() 加載數據。
isPrepared參數在系統調用onActivityCreated時設置為true,這時onCreateView方法已調用完畢(一般我們在這方法里執行findviewbyid等方法),確保 onLazyLoad()方法不會報空指針異常。
isLazyLoaded確保ViewPager來回切換時BaseFragment的initData方法不會被重復調用,onLazyLoad在該Fragment的整個生命周期只調用一次,第一次調用onLazyLoad()方法后馬上執行 isLazyLoaded = true。
然后再繼承這個BaseMVPLazyFragment實現onLazyLoad() 方法就行。他會自動控制當fragment 展現出來時,才會加載數據
4.5 Fragment的方法setUserVisibleHint
源碼如下所示
通過此方法來設置Fragment的UI對用戶是否可見,當該頁面對用戶可見/不可見時,系統都會回調此方法。
我們可以重寫此方法,然后根據回調的isVisibleToUser參數來進行相關的邏輯判斷,以達到懶加載的效果,比如如果isVisibleToUser==true的話表示當前Fragment對用戶可見,此時再去加載頁面數據。
5.懶加載Fragment為什么要繼承BaseFragment
5.1 繼承BaseFragment好處
這個BaseFragment就是最基礎的基類了,里面進行一些最底層的設置,定義抽象函數:比如布局文件的綁定,初始化視圖控件,初始化數據,初始化Toolbar
所以這個懶加載LazyLoadFragment基本上是隔離開了。耦合度相當低,基本都可以這樣使用吧。
還有一點,有些Fragment不需要懶加載,那么可以直接繼承BaseFragment類;需要懶加載的直接繼承BaseMVPLazyFragment類
6.關于我的個人博客和站點
總結
以上是生活随笔為你收集整理的android预加载布局,Android 懒加载优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 开发小工具,Androi
- 下一篇: magicui系统会不会升级鸿蒙,华为E