Android Fragment之一行代码实现懒加载

1、简介

开发也有一段时间了,不能说一直忽略懒加载,但是由于之前一直没有很好的掌握,故而希望借这次机会真真正正的把懒加载做好,因为不然性能真的很差,真的很难忍受初始化的时候明明只是进入了Fragment A 而 Fragment B  C  D 确得到了加载。这样真的非常的不好,因为每一个Fragment主页可能都会有很多的资源和网络请求需要进行加载,可想而知是非常的缓慢的,而且很很饿容易造成内存不够的问题。说了这么多,有吐槽自己的不足点,也阐明了懒加载的必要性,下面就有有必要整理下实际项目中的懒加载应该如何做。OK,下面开始吧

2、开发准备

对Fragment可以熟练的使用;

采用开源框架Fragmentation这真的是一款特别优秀的Fragment管理工具,使用它只会对开发上事半功倍。链接

底部菜单指示器采用BottomBar 来实现的。

3、开发过程

a.未做处理的运行效果

 我在每个加载的Fragmet中的initVIew( ) 和 initData( ) 中都加入了log。

可以发现,只要一进入,那么就会加载全部的四个Fragment的VIew 和 数据,假设每个界面都需要进行大额的网络请求,可想而知那肯定是灾难的啊,卡顿不说,性能还不好,用户明明没点进去啊,怎么数据就加载了呢,非常非常的不好。

08-17 17:20:36.410 8621-8621/com.example.myapplication22 E/initView:  ---- 第三个Fragment-----
08-17 17:20:36.410 8621-8621/com.example.myapplication22 E/initData:  ---- 第三个Fragment-----
08-17 17:20:36.412 8621-8621/com.example.myapplication22 E/initView:  ---- 第二个Fragment-----
08-17 17:20:36.412 8621-8621/com.example.myapplication22 E/initData:  ---- 第二个Fragment-----
08-17 17:20:36.413 8621-8621/com.example.myapplication22 E/initView:  ---- 第四个Fragment-----
08-17 17:20:36.413 8621-8621/com.example.myapplication22 E/initData:  ---- 第四个Fragment-----
08-17 17:20:36.415 8621-8621/com.example.myapplication22 E/initView:  ---- 第一个Fragment-----
08-17 17:20:36.415 8621-8621/com.example.myapplication22 E/initData:  ---- 第一个Fragment-----

b. 进行改进

   

08-17 17:44:24.014 15253-15253/com.example.myapplication22 E/initView:  ---- 第二个Fragment-----
08-17 17:44:24.017 15253-15253/com.example.myapplication22 E/initView:  ---- 第三个Fragment-----
08-17 17:44:24.018 15253-15253/com.example.myapplication22 E/initView:  ---- 第四个Fragment-----
08-17 17:44:24.019 15253-15253/com.example.myapplication22 E/initView:  ---- 第一个Fragment-----
08-17 17:44:24.062 15253-15253/com.example.myapplication22 E/initData:  ---- 第一个Fragment-----
08-17 17:44:25.232 15253-15253/com.example.myapplication22 E/initData:  ---- 第二个Fragment-----
08-17 17:44:26.519 15253-15253/com.example.myapplication22 E/initData:  ---- 第三个Fragment-----
08-17 17:44:27.255 15253-15253/com.example.myapplication22 E/initData:  ---- 第四个Fragment-----

好了这样明显是在加载数据的时候,执行了initDat()方法的。真的是完美!

下面贴出BaseFragment,可以发现只要把方法放在onLazyInitView里面就可以了

public abstract class BaseFragment<V extends BaseView,T extends BasePresenter<V>> extends SupportFragment {
    protected T mPresenter;
    private MaterialDialog mMaterialDialog;
    private MaterialDialog mWaitMaterialDialog;
    @SuppressWarnings("SpellCheckingInspection")
    private Unbinder mUnbinder = null;

    @SuppressWarnings("unchecked")
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        init();
        //判断是否使用MVP模式
        mPresenter = createPresenter();
        if (mPresenter != null) {
            //因为之后所有的子类都要实现对应的View接口
            mPresenter.attachView((V) this);
        }
    }


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(provideContentViewId(),container,false);
        mUnbinder = ButterKnife.bind(this, rootView);
        initView(rootView);
        //还是挺不错的
        return rootView;
    }


    /**
     * 后
     * @param savedInstanceState
     */
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

    }

    @Override
    public void onLazyInitView(@Nullable Bundle savedInstanceState) {
        super.onLazyInitView(savedInstanceState);
        initData();
        initListener();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mPresenter != null) {
            mPresenter.detachView();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/crazyZhangxl/article/details/81778856
今日推荐