Android基于OkHttpUtils網(wǎng)絡(luò)請(qǐng)求的二次封裝
OkHttpUtils網(wǎng)絡(luò)請(qǐng)求為什么進(jìn)行二次封裝?
1、減少代碼量
2、后期換網(wǎng)絡(luò)處理框架方便
二次封裝的實(shí)現(xiàn)原理
1、將網(wǎng)絡(luò)請(qǐng)求提取在一個(gè)方法中
2、對(duì)里面的可變參數(shù),可以通過(guò)參數(shù)傳遞過(guò)去,也可以提供一個(gè)set方法傳遞過(guò)去
3、對(duì)于請(qǐng)求失敗和成功,我們可以使用接口回調(diào),讓調(diào)用該方法的對(duì)象處理
封裝后的網(wǎng)絡(luò)處理類的功能
1、網(wǎng)絡(luò)請(qǐng)求
2、xml數(shù)據(jù)轉(zhuǎn)換成javaBean
每一個(gè)處理網(wǎng)絡(luò)請(qǐng)求的ListView都要處理的3數(shù)據(jù)方法
1、初始化數(shù)據(jù)
2、下拉刷新數(shù)據(jù)
3、上拉加載數(shù)據(jù)
封裝前的代碼
/** * 3,加載更多 * 注意事項(xiàng): * 請(qǐng)求成功數(shù)據(jù)更新之后,要關(guān)閉SpringView */ private void onDealLoadmore() { //資訊的網(wǎng)絡(luò)請(qǐng)求地址 String newsUrl = Constant.NEWS_URL; //http://www.oschina.net/action/api/news_list?pageIndex=0&catalog=1&pageSize=20 //關(guān)閉SpringView mSpringView.onFinishFreshAndLoad(); //網(wǎng)絡(luò)請(qǐng)求 OkHttpUtils .get() .url(newsUrl) .addParams("pageIndex", mCurrentPageIndex + "")//固定 .addParams("catalog", "1")//固定,1代表資訊 .addParams("pageSize", "20")//因?yàn)?一頁(yè)加載20條數(shù)據(jù) .build() .execute(new StringCallback() { @Override public void onError(Call call, Exception e, int id) { Toast.makeText(mContext, "上拉加載失敗", Toast.LENGTH_SHORT).show(); /* //關(guān)閉SpringView mSpringView.onFinishFreshAndLoad();*/ } @Override public void onResponse(String response, int id) { //請(qǐng)求成功,將字符串轉(zhuǎn)為javaBean,并獲取里面的泛型為News的集合 NewsList newsList = XmlUtils.toBean(NewsList.class, response.getBytes()); //對(duì)請(qǐng)求的數(shù)據(jù)進(jìn)行非空判斷 if (newsList != null) { List<News> list = newsList.getList(); if (list != null && list.size() > 0) { //數(shù)據(jù)的更新 mData.addAll(newsList.getList()); //適配器的更新 mMyNewsPagerAdapter.notifyDataSetChanged(); //請(qǐng)求頁(yè)的索引要加1 ++mCurrentPageIndex; /* //關(guān)閉SpringView mSpringView.onFinishFreshAndLoad();*/ } } } }); }
封裝后的代碼
/** * 3,加載更多 * 注意事項(xiàng): * 請(qǐng)求成功數(shù)據(jù)更新之后,要關(guān)閉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) { //獲取刷新的數(shù)據(jù)集合 List<News> list = newsList.getList(); //健壯性判斷 if (list != null && list.size() > 0) { //更新數(shù)據(jù)集合 mData.addAll(list); //更新適配器 mMyNewsPagerAdapter.notifyDataSetChanged(); //更新頁(yè)數(shù)的索引值 mCurrentPageIndex ++ ; } } } }); }
網(wǎng)絡(luò)封裝的代碼
/** * Author: 歸零 * Date: 2017/3/4 1:08 * Email: 4994766@qq.com * Description:網(wǎng)絡(luò)請(qǐng)求和數(shù)據(jù)解析 */ public class NewsPagerProtocol { private int mCurrentPageIndex; public void setCurrentPageIndex(int currentPageIndex) { mCurrentPageIndex = currentPageIndex; } public void loadData(final Callback callback) { //資訊的網(wǎng)絡(luò)請(qǐng)求地址 String newsUrl = Constant.NEWS_URL; //http://www.oschina.net/action/api/news_list?pageIndex=0&catalog=1&pageSize=20 //網(wǎng)絡(luò)請(qǐng)求 OkHttpUtils .get() .url(newsUrl) .addParams("pageIndex", mCurrentPageIndex + "")//固定 .addParams("catalog", "1")//固定,1代表資訊 .addParams("pageSize", "20")//因?yàn)?一頁(yè)加載20條數(shù)據(jù) .build() .execute(new StringCallback() { @Override public void onError(Call call, Exception e, int id) { //因?yàn)榉祷厥√幚淼恼?qǐng)求不一樣,所以不處理,交給調(diào)用的方法處理 callback.onError(call, e, id); } @Override public void onResponse(String response, int id) { //請(qǐng)求成功,將字符串轉(zhuǎn)為javaBean,并獲取里面的泛型為News的集合 NewsList newsList = XmlUtils.toBean(NewsList.class, response.getBytes()); //將轉(zhuǎn)換后的數(shù)據(jù)通過(guò)接口回調(diào),返回給調(diào)用方法的 callback.onResponse(newsList, id); } }); } public interface Callback { public void onError(Call call, Exception e, int id); public void onResponse(NewsList newsList, int id); } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android筆記之:App應(yīng)用之啟動(dòng)界面SplashActivity的使用
當(dāng)前比較成熟一點(diǎn)的應(yīng)用基本上都會(huì)在進(jìn)入應(yīng)用之顯示一個(gè)啟動(dòng)界面.這個(gè)啟動(dòng)界面或簡(jiǎn)單,或復(fù)雜,或簡(jiǎn)陋,或華麗,用意不同,風(fēng)格也不同2013-04-04android自定義view實(shí)現(xiàn)推箱子小游戲
這篇文章主要為大家詳細(xì)介紹了android自定義view實(shí)現(xiàn)推箱子小游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04基于Android實(shí)現(xiàn)跳轉(zhuǎn)到WiFi開關(guān)設(shè)置頁(yè)的詳細(xì)步驟
在Android應(yīng)用開發(fā)中,有時(shí)候需要引導(dǎo)用戶到特定的系統(tǒng)設(shè)置頁(yè)面,例如Wi-Fi開關(guān)設(shè)置頁(yè),可以通過(guò)隱式Intent來(lái)實(shí)現(xiàn)這一功能,以下是詳細(xì)的步驟以及相關(guān)的Kotlin代碼示例,需要的朋友可以參考下2024-09-09Android Activity的4種啟動(dòng)模式圖文介紹
這篇文章主要給大家介紹了關(guān)于Android Activity的4種啟動(dòng)模式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Android自定義實(shí)現(xiàn)淘寶下拉刷新效果
這篇文章主要為大家詳細(xì)介紹了Android自定義實(shí)現(xiàn)淘寶下拉刷新效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Android APP檢測(cè)實(shí)體按鍵事件詳解
這篇文章主要為大家詳細(xì)介紹了Android APP檢測(cè)實(shí)體按鍵事件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08android接收到藍(lán)牙配對(duì)請(qǐng)求時(shí)如何點(diǎn)亮屏幕具體實(shí)現(xiàn)
android 在接收到藍(lán)牙配對(duì)請(qǐng)求時(shí)如何自動(dòng)點(diǎn)亮屏幕配對(duì)過(guò)程中很實(shí)用,具體的實(shí)現(xiàn)思路及代碼如下,感興趣的朋友可以參考下哈2013-06-06