android中lazyLoad
在android的项目开发过程中viewPager的使用很频繁;但是viewPager特殊的预加载机制导致viewPager的网络请求会有异常;即当前页面加载过程中,不可见的预加载页面也会走网络请求,由于android中ui加载页面有生命周期,不可见的预加载页面网络请求揍不到相关的生命周期有时候会导致加载框持续加载,ui无法bind数据;
下面添加代码,以之前开发的一个项目为例:
首先是一个ViewPager复用的一个Fragment<在这里基类封装懒加载>
public class MultipleFragment extends LazyLoadFragment {
@BindView(R.id.recycler_multiple)
RecyclerView recyclerView;
@BindView(R.id.springview)
SpringView springview;
Unbinder unbinder;
private MultipleAdapter mAdapter;
private int currentPager;
private int type;
private List<SchoolSelectInfo.DataBean> mInfo;
private int currentNum;
@Override
public int getLayout() {
return R.layout.fragment_multiple;
}
@Override
protected void initViews(View view) {
ButterKnife.bind(this,view);
recyclerView.setLayoutManager(new LinearLayoutManager(mActivity));
recyclerView.addItemDecoration(new MyDecoration(mActivity, MyDecoration.VERTICAL_LIST));
}
@Override
public void loadData() {
super.loadData();
//get data by jsonObj
currentPager = 1;
currentNum = 10;
requstData();
}
private void requstData() {
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("pagesize",currentNum);
jsonObject.put("pageindex", currentPager);
jsonObject.put("findtype",type );
jsonObject.put("regionname", Constant.mProvince);
jsonObject.put("longitude", Constant.mLongitude);
jsonObject.put("latitude", Constant.mLatitude);
jsonObject.put("keywords", "");
} catch (JSONException e) {
e.printStackTrace();
}
String data = jsonObject.toString().replaceAll("\"(\\w+)\"(\\s*:\\s*)", "$1$2");
SchoolSelectPresenter
.getInstance(mActivity)
.setSelf(this);
SchoolSelectPresenter
.getInstance(mActivity)
.getRequestData(mActivity,"1002",data);
}
//refresh initData
@Override
public void iniRefresh() {
super.iniRefresh();
currentPager = 1;
requstData();
}
//loadmore initData
@Override
public void initLoadMore() {
super.initLoadMore();
currentPager = currentPager + 1;
/*currentNum = currentNum + 10;*/
requstData();
}
public void setType(int type) {
this.type = type;
}
public void setInfo(List<SchoolSelectInfo.DataBean> info) {
if(currentPager == 1){
this.mInfo = info;
}else {
//add info
mInfo.addAll(info);
}
springview.onFinishFreshAndLoad();
mAdapter = new MultipleAdapter(mActivity,mInfo);
recyclerView.setAdapter(mAdapter);
//refresh adapter
mAdapter.notifyDataSetChanged();
setPullRefresh(springview,true);
}
}
ok~下面看自定义的lazyloadFragment:
public abstract class LazyLoadFragment extends Fragment {
private boolean isViewCreated;
private boolean isLoadDataCompleted;
protected Activity mActivity;
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.mActivity=(Activity) context;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(getLayout(), container, false);
initViews(view);
isViewCreated = true;
return view;
}
public abstract int getLayout();
protected abstract void initViews(View view);
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if(getUserVisibleHint()){
loadData();
}
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
LogUtil.i(isVisibleToUser + "" + isViewCreated + !isLoadDataCompleted);
if (isVisibleToUser && isViewCreated && !isLoadDataCompleted){
loadData();
}else{
isLoadDataCompleted = false;
isViewCreated = false;
}
}
public void loadData() {
isLoadDataCompleted=true;
}
/**设置刷新和加载*/
public void setPullRefresh(final SpringView springView, final boolean isLoadMore){
springView.setType(SpringView.Type.FOLLOW);
springView.setListener(new SpringView.OnFreshListener() {
@Override
public void onRefresh() {
iniRefresh();
}
@Override
public void onLoadmore() {
initLoadMore();
}
});
if (isLoadMore){
springView.setHeader(new DefaultHeader(mActivity));
springView.setFooter(new DefaultFooter(mActivity));
}else{
View headerView = springView.getHeaderView();
springView.removeView(springView.getHead());
}
}
/**刷新逻辑*/
public void iniRefresh() {}
/**加载更多的逻辑*/
public void initLoadMore() {}
}
由以上代码可以看出,lazyloadFragment中通过控制页面的展示与消失有效控制网络的请求,这样便有效防止viewPager预加载过程中不可见页面的无效网络请求
谢谢打赏~