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