基于OkHttpUtils网络请求的二次封装(简单版)

为什么进行二次封装

1,减少代码量
2,后期换网络处理框架方便

二次封装的实现原理

1,将网络请求提取在一个方法中
2,对里面的可变参数,可以通过参数传递过去,也可以提供一个set方法传递过去
3,对于请求失败和成功,我们可以使用接口回调,让调用该方法的对象处理

封装后的网络处理类的功能

1,网络请求
2,xml数据转换成javaBean

每一个处理网络请求的ListView都要处理的3数据方法

1,初始化数据
2,下拉刷新数据
3,上拉加载数据

封装前的代码

 /**
     * 3,加载更多
     * 注意事项:
     *  请求成功数据更新之后,要关闭SpringView
     */
    private void onDealLoadmore() {
        //资讯的网络请求地址
        String newsUrl = Constant.NEWS_URL;
        //http://www.oschina.net/action/api/news_list?pageIndex=0&catalog=1&pageSize=20
        //关闭SpringView
        mSpringView.onFinishFreshAndLoad();
        //网络请求
        OkHttpUtils
                .get()
                .url(newsUrl)
                .addParams("pageIndex", mCurrentPageIndex + "")//固定
                .addParams("catalog", "1")//固定,1代表资讯
                .addParams("pageSize", "20")//因为,一页加载20条数据
                .build()
                .execute(new StringCallback() {
                    @Override
                    public void onError(Call call, Exception e, int id) {
                        Toast.makeText(mContext, "上拉加载失败", Toast.LENGTH_SHORT).show();
                       /* //关闭SpringView
                        mSpringView.onFinishFreshAndLoad();*/
                    }

                    @Override
                    public void onResponse(String response, int id) {
                        //请求成功,将字符串转为javaBean,并获取里面的泛型为News的集合
                        NewsList newsList = XmlUtils.toBean(NewsList.class, response.getBytes());
                        //对请求的数据进行非空判断
                        if (newsList != null) {
                            List<News> list = newsList.getList();
                            if (list != null && list.size() > 0) {
                                //数据的更新
                                mData.addAll(newsList.getList());
                                //适配器的更新
                                mMyNewsPagerAdapter.notifyDataSetChanged();
                                //请求页的索引要加1
                                ++mCurrentPageIndex;
                              /*  //关闭SpringView
                                mSpringView.onFinishFreshAndLoad();*/

                            }
                        }
                    }
                });

    }

封装后的代码

 /**
     * 3,加载更多
     * 注意事项:
     * 请求成功数据更新之后,要关闭SpringView
     */
    private void onDealLoadmore() {
        mSpringView.onFinishFreshAndLoad();
        mNewsPagerProtocol.setCurrentPageIndex(mCurrentPageIndex);
        mNewsPagerProtocol.loadData(new NewsPagerProtocol.Callback() {
            @Override
            public void onError(Call call, Exception e, int id) {
                Toast.makeText(mContext, "下拉刷新失败", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onResponse(NewsList newsList, int id) {

                if (newsList != null) {


                    //获取刷新的数据集合
                    List<News> list = newsList.getList();
                    //健壮性判断
                    if (list != null && list.size() > 0) {
                        //更新数据集合
                        mData.addAll(list);
                        //更新适配器
                        mMyNewsPagerAdapter.notifyDataSetChanged();
                        //更新页数的索引值
                        mCurrentPageIndex ++ ;
                    }
                }

            }
        });

    }

网络封装的代码


/**
 * Author:      归零
 * Date:        2017/3/4 1:08
 * Email:       [email protected]
 * Description:网络请求和数据解析
 */
public class NewsPagerProtocol {


    private int mCurrentPageIndex;

    public void setCurrentPageIndex(int currentPageIndex) {

        mCurrentPageIndex = currentPageIndex;
    }


    public void loadData(final Callback callback) {
        //资讯的网络请求地址
        String newsUrl = Constant.NEWS_URL;
        //http://www.oschina.net/action/api/news_list?pageIndex=0&catalog=1&pageSize=20
        //网络请求
        OkHttpUtils
                .get()
                .url(newsUrl)
                .addParams("pageIndex", mCurrentPageIndex + "")//固定
                .addParams("catalog", "1")//固定,1代表资讯
                .addParams("pageSize", "20")//因为,一页加载20条数据
                .build()
                .execute(new StringCallback() {
                    @Override
                    public void onError(Call call, Exception e, int id) {
                        //因为返回失败处理的请求不一样,所以不处理,交给调用的方法处理
                        callback.onError(call, e, id);
                    }

                    @Override
                    public void onResponse(String response, int id) {
                        //请求成功,将字符串转为javaBean,并获取里面的泛型为News的集合
                        NewsList newsList = XmlUtils.toBean(NewsList.class, response.getBytes());
                        //将转换后的数据通过接口回调,返回给调用方法的
                        callback.onResponse(newsList, id);
                    }
                });
    }


    public interface Callback {

        public void onError(Call call, Exception e, int id);

        public void onResponse(NewsList newsList, int id);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章