使用Fragment懶加載的一種方式
在很多應用中,首頁都是由三個或四個Fragment構成,且都是上中下結構。這種設計方式大行其道,但是作為首頁,每一個Fragment的內容肯定是較多的,這個時候直接加載出來,或是默認加載兩三個都是有點耗費資源的,特別是在打開應用的時候,如果操作過多可能會卡,所以很多應用在首頁都會使用Fragment懶加載,例如微信。
對于如何懶加載,也算是Android中比較簡單的內容,本文只是針對這個問題提供一種比較通用的解決方法。如果你對Android開發比較熟悉的話,不要讓本文浪費你的時間。如果你閱讀本文,你將會學習如下內容:
-
Fragment 中 setUserVisibleHint 函數
-
上中下結構的首頁設計實現
-
Fragment 懶加載的一種實現方式
一,創建懶加載基類Fragment
這個函數簡單來說就是用來表明該Fragment是否向用戶展示,如果用戶能夠看到該Fragment,那么這個函數的參數則為 true 。說起來簡單,但是這個函數有個特別需要注意的地方就是 此函數不是生命周期函數 。也就是說,該方法有可能在脫離生命周期的地方調用,例如當Fragment還沒有 onCreateView 時,這個函數就有可能調用,而此時如果控制界面的話,就會出現 NullPointerException 。在進行懶加載的處理時,這一點需要特別照顧。
在這種懶加載方式中,先創建一個LazyFragment實現懶加載的所有操作,然后再創建其子類作為實際使用。這樣的話,只要是繼承自這個LazyFragment的Fragment就會具有懶加載的功能,方便實際使用。
1. 首先,為了進行懶加載,設定幾個標志:
private boolean hasLoaded = false; //標識是否已經加載過
private boolean hasCreated = false; //標識onCreateView是否已調用
private boolean needInit = false; //標識是否需要在onCreateView中
2. 在 setUserVisibleHint 中進行判斷處理
if (isVisibleToUser && !hasLoaded) { //如果當前Fragment向用戶展示且沒有加載過,進行下一步判斷
if (hasCreated) { //如果onCreateView已經被創建,此時進行加載
initWrapper();
} else { //如果Fragment沒有創建,那么設置標記,在onCreateView中加載
needInit = true;
}
}
此處進行的一些判斷操作就是為了處理此函數在Fragment還沒有創建界面時的情況。如果出現了這種情況,那么設置標記位在 onCreateView 中加載。其中 initWrapper 函數來進行加載界面,而此時加載的僅僅為該LazyFragment的界面,只包含一個 ProgressBar 和 FramentLayout 。其中 ProgressBar 僅僅為加載之前的展示,而 FramentLayout 則是用來放置其子類布局的。
private void initWrapper() {
LayoutInflater.from(getContext()).inflate(setContentView(), content);
initialize();
fadeOutView(progressBar, mShortAnimationDuration);
fadeInView(content, mShortAnimationDuration);
hasLoaded = true;
}
3. 創建子類使用的函數
/**
* 供子類使用,子類fragment初始化操作,此函數內部真正開始進行頁面的一些列操作
*/
abstract void initialize();
/**
* 子類fragment設置布局,返回fragment要設定的布局
* @return 子類fragment要顯示的布局
*/
@LayoutRes
abstract int setContentView();
上面基本都是創建Fragment懶加載基類重點的地方,其子類只需要復寫上面兩個函數就可以以懶加載的方式使用。其他內容可以使用查看項目倉庫。
二,創建懶加載子類Fragment
其實只要實現了基類,那么懶加載框架就已經基本完成,繼承子類只是來使用,這個地方是比創建其基類要容易很多。創建其子類只需要復寫這兩個函數,這樣就可以作為一個普通的Fragment來使用:
@Override
void initialize() {
//用來進行本Fragment的初始化操作
}
@Override
int setContentView() {
return R.layout.fragment; //返回本類所的布局
}
三,創建使用懶加載Fragments的Activity
一般來說使用標簽頁的Activity,都是上中下結構,上面 Toolbar ,中間 FrameLayou 用來顯示內容,下面就是 Bottom Navigation Tab。這種實現并沒有什么難度,也有很多種實現方式,特別是底部導航欄。而在中間,本例子種使用的是 ViewPager ,這樣可以實現左右滑動切換,也是微信的加載方式。其中代碼與Fragment懶加載無關,所以就不再贅述。
來自:http://www.jianshu.com/p/b95349fbdf18