Fragment懶載入
阿新 • • 發佈:2019-12-16
Fragment
最常見的使用方式就是ViewPager
巢狀Fragment
和直接通過FragmentManager
來管理Fragment
。 如果每個Fragment
都有預設的網路請求操作 那麼多個在Fragment
建立過程中都會執行預設網路請求,無論Fragment
是否對使用者可見,顯然有些浪費流量、影響性App
效能。讓我們來優化一下!
話不多說,直接上程式碼 BaseFragment
public abstract class BaseFragment extends Fragment {
/***
* 是否初始化過佈局
*/
private boolean isViewInitiated;
/***
* 當前介面是否可見
*/
private boolean isVisibleToUser;
/***
* 是否載入過資料
*/
private boolean isDataInitiated;
/***
* 根佈局
*/
protected View mView;
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
isViewInitiated = true;
prepareData();
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mView = inflater.inflate(getLayoutId(), container, false);
initView();
initData();
doEvent();
return mView;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
this.isVisibleToUser = isVisibleToUser;
if (isVisibleToUser) {
prepareData();
isDataInitiated = true;
}
}
/***
* 判斷懶載入的條件
*/
private void prepareData() {
if (isVisibleToUser && isViewInitiated && !isDataInitiated) {
loadData();
}
}
/***
*
* @return Fragment要載入的佈局
*/
protected abstract int getLayoutId();
/***
* 初始化控制元件
*/
protected abstract void initView();
/***
* 初始化資料
*/
protected abstract void initData();
/***
* 點選事件
*/
protected abstract void doEvent();
/***
* 載入資料
*/
protected abstract void loadData();
@Override
public void onDestroy() {
super.onDestroy();
mView = null;
}