android中的懒加载机制

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预加载过程中不可见页面的无效网络请求
谢谢打赏~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值