1.为什么需要懒加载出现?
很多时候我们在做程序加载的时候会发现,有时候因为对象创建的顺序不一定,而导致在加载的时候出现null或者其他的异常所以就需要一种能够解决这种不确定的加载请求。
2.解决问题的关键在哪里?
1.请求先后 2.要满足一次请求任务
3.例如懒加载的用例
首先在创建的时候设置允许进行加载也就是第一个可加载条件
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
fragmentLazyloadHelper.setViewHasCreate(true);
}
在显示状态中设置另一个满足条件
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
fragmentLazyloadHelper.setVisibleToUser(isVisibleToUser);
}
getFragmentLazyloadHelper().bind(this);//注册可接受事件 然后也可以通过unbind实现事件的解绑
/**
* 用来处理懒加载的 安全的避免了视图未加载导致的null对象
* <p>
* todo 目前没有发现问题
*/
public static class FragmentLazyLoadHelper {
boolean isVisibleToUser = false;
boolean isViewHasCreate = false;
boolean isEnableAccept = true;
//设置是否允许进行懒加载 默认允许懒加载
public void setEnableAccept(boolean enableAccept) {
isEnableAccept = enableAccept;
}
public void setViewHasCreate(boolean viewHasCreate) {
isViewHasCreate = viewHasCreate;
if (isViewHasCreate)
requeLazyLoad();
}
public void setVisibleToUser(boolean visibleToUser) {
isVisibleToUser = visibleToUser;
if (visibleToUser) {
isHasRequestLayLoad = false;
requeLazyLoad();
}
}
public boolean isViewHasCreate() {
return isViewHasCreate;
}
//是否是当前显示的状态 当然因为第一页直接设置了为true
public boolean isVisibleToUser() {
return isVisibleToUser;
}
ILazyLoadListener lazyLoadListener;
public interface ILazyLoadListener {
void accept();
}
//是否已经懒加载过
boolean isHasRequestLayLoad = false;
//请求拉去事件
//总之 只要想要达到 视图可见时候操作数据都可以通过这个回调
public void requeLazyLoad() {
//不允许懒加载
if (!isEnableAccept) {
return;
}
if (isHasRequestLayLoad)
return;
//如果是可见的状态 并且视图已经加载完毕
if (isVisibleToUser() && isViewHasCreate()) {
//如果视图加载完成状态 说明可以加载了
if (lazyLoadListener != null) {
lazyLoadListener.accept();
isHasRequestLayLoad = true;
}
}
}
public void bind(ILazyLoadListener listener) {
lazyLoadListener = listener;
}
//解绑了以后就不会在接收到任何事件
public void unbind() {
lazyLoadListener = null;
}
}