1. 程式人生 > >Fragment懶載入

Fragment懶載入

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;
    }