Fragment懶加載的實現(xiàn)思路:
- 1.主要是通過 ==setUserVisibleHint(boolean isVisibleToUser)== 方法來判斷當(dāng)前Fragment是否可見骂租,如果可見就調(diào)用lazyData()加載數(shù)據(jù)避咆,否則就不加載數(shù)據(jù)。即我們需要聲明一個==isVisibleToUser==變量判斷View是否可見静秆。
private boolean isVisibleToUser;//判斷View是否可見
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
this.isVisibleToUser=isVisibleToUser;
lazyLoad();
}
- 2.需要注意的是==setUserVisibleHint(boolean isVisibleToUser)== 方法的回調(diào)時機(jī)并沒有與fragment的生命周期有確切的關(guān)聯(lián)牵素,所以該方法被調(diào)用的時機(jī)可能在onCreateView()之前也可能在onCreateView()之后严衬。故需要聲明一個==isViewPrepared==變量來判斷View是否創(chuàng)建完成,避免空指針两波;
private boolean isViewPrepared;//View是否初始化完成瞳步;
//Fragment的View的已加載完畢闷哆;
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
isViewPrepared=true;
}
- 3.數(shù)據(jù)咱們只需要加載一次腰奋,故再聲明個==isInitDataOver==變量來判斷數(shù)據(jù)是否已經(jīng)加載完成。
private boolean isInitDataOver=false;//判斷數(shù)據(jù)是否已經(jīng)加載完成
- 5.前面由于各個變量已經(jīng)準(zhǔn)備好抱怔,那么我們來實現(xiàn) ==lazyData()== 的編寫劣坊,邏輯思路為數(shù)據(jù)還沒加載且View可見,且Fragment已經(jīng)加載完畢屈留。
private void lazyLoad() {
if (!isInitDataOver && isVisibleToUser &&isViewPrepared ){
forceLoad=false;
isInitDataOver=true;
initData()//抽象方法
}
}
- 4.還有一個容易忽略的地方我們需要注意局冰,對于第一個fragment,
==setUserVisibleHint(boolean isVisibleToUser)== 如果在OnCreateView()之前調(diào)用,那么咱們的數(shù)據(jù)就獲取不到了灌危,所以需要在onActivityCreated()中主動調(diào)用下加載lazyData()方法康二;
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//對于第一個Fragment的時候,主動加載勇蝙;
lazyLoad();
}
完整源碼:
public class BaseFragment extends Fragment
private boolean isInitDataOver;//判斷數(shù)據(jù)是否加載完成
private boolean isViewPrepared;//View是否初始化完成沫勿;
private boolean isVisibleToUser;//判斷View是否可見
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
this.isVisibleToUser=isVisibleToUser;
lazyLoad();
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (mRootView==null){
//填充內(nèi)容頁面
}
return mRootView;
}
//Fragment的View的已加載完畢;
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
isViewPrepared=true;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//對于第一個Fragment的時候味混,主動加載产雹;
lazyLoad();
}
private void lazyLoad() {
if (!isInitDataOver && isVisibleToUser &&isViewPrepared ){
forceLoad=false;
isInitDataOver=true;
//在此實現(xiàn)加載數(shù)據(jù)
}
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者