Fragment的懶加載模式

當前開發(fā)的app有許多應(yīng)用在UI設(shè)計上都是仿照微信,在MainActivity中使用ViewPager來展示頁面,但是基本上目前所有的應(yīng)用都需要請求網(wǎng)絡(luò)來獲取數(shù)據(jù)。而ViewPager的特性是預(yù)加載,這樣就會造成我不想看其他頁面的內(nèi)容,但是它已經(jīng)加載完成,造成用戶流量的浪費。這樣就需要使用懶加載,只有當用戶可見時,才去加載數(shù)據(jù)。在此數(shù)據(jù)只加載一次,當用戶需要刷新數(shù)據(jù)時可以使用下拉刷新等方式。當然你也可以不做這個設(shè)置。只需要稍微修改一下就可以了。
在此先要說下一下幾個方法:
1.ViewPager中的setOffscreenPageLimit方法,設(shè)置預(yù)加載的個數(shù),參數(shù)不能小于1,可設(shè)為MainActivity下的tab數(shù)目。
2.Fragment中的setUserVisibleHint方法,當參數(shù)為true時對用戶可見,當為false時對用戶不可見(注意:此處有坑,后面再說)
下面貼代碼:

/**
 * Created by LiJZ
 */
public abstract class LazyFragment extends Fragment {

    protected View view;
    /**
     * 是否對用戶可見的標志位
     */
    private boolean isVisible;
    /**
     * 判斷view是不是已經(jīng)填充完畢的標記位
     */
    private boolean isPrepared;
    /**
     * 是否已經(jīng)加載過數(shù)據(jù)
     */
    private boolean isAlreadyLoadData = false;

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {

        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
            isVisible = true;
            onVisible();
        } else {
            isVisible = false;
            onInVisible();
        }
    }

    /**
     * setUserVisibleHint為true時調(diào)用的方法
     */
    private void onVisible() {
        lazyLode();
    }

    /**
     * setUserVisibleHint為false時調(diào)用的方法
     */
    private void onInVisible() {
        if (isAlreadyLoadData) {
            InVisibleEvent();
            System.out.println("LazyFragment.onInVisible:InVisibleEvent");
        }
    }

    private void lazyLode() {
        //確保View初始化完成
        if (!isVisible||!isPrepared) {
            return;
        }
        //加載數(shù)據(jù)
        if (!isAlreadyLoadData) {//如果沒有加載過數(shù)據(jù)
            initLazyLodeData();
            isAlreadyLoadData = true;
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (view == null) {
            view = View.inflate(getActivity(), getLayoutId(), null);
        }
        ViewGroup parent = (ViewGroup) view.getParent();
        if (parent != null) {
            parent.removeView(view);
        }

        initview();
        isPrepared = true;
        System.out.println("LazyFragment.onCreateView"+"----->"+getClassName());
        return view;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        lazyLode();
        initData();
        initEvent();
    }

    /**
     * 布局xml文件的id
     * @return
     */
    public abstract int getLayoutId();

    /**
     * 在onCreateView中調(diào)用,可以執(zhí)行findViewbyId操作
     */
    public abstract void initview();

    /**
     * 初始化懶加載的數(shù)據(jù)
     */
    public abstract void initLazyLodeData();

    /**
     * 初始化數(shù)據(jù)
     */
    public abstract void initData();

    /**
     * 初始化事件
     */
    public abstract void initEvent();

    /**
     * 加載過數(shù)據(jù)后,fragment變?yōu)椴豢梢娭蟮男枰獔?zhí)行的操作
     */
    public abstract void InVisibleEvent();

    public String getClassName() {
        return getClass().getSimpleName();
    }

    @Override
    public void onResume() {
        super.onResume();
        System.out.println("onResume"+"----->"+getClassName());
    }

    @Override
    public void onPause() {
        super.onPause();
        System.out.println("onPause"+"----->"+getClassName());
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        System.out.println("onDestroyView"+"----->"+getClassName());
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        System.out.println("onDestroy"+"----->"+getClassName());
    }
}

地址:https://github.com/lijingzhao2008/FragmentLazyLoad.git
注意:
此種方式在ViewPager+Fragment情況下使用沒問題,當UI結(jié)構(gòu)為ViewPager+Fragment+Viewpager時,在內(nèi)層ViewPager中會出現(xiàn)問題。因為setUserVisibleHint不同步。
可以參考這篇文章:http://www.lxweimin.com/p/e7449278e33d
Android的嵌套很容易出現(xiàn)問題,搭建布局前先考慮好各方面的問題,否則就是給自己找事情做。這是我老大當初給我說的。都是淚啊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容