基於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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章