Android Xutils3網(wǎng)絡(luò)請(qǐng)求的封裝詳解及實(shí)例代碼
Xutils3網(wǎng)絡(luò)請(qǐng)求的封裝詳解
封裝了一個(gè)Xutil3的網(wǎng)絡(luò)請(qǐng)求工具類,分享給大家,本人水平有限,不足之處歡迎指出。
使用前先配置xutils3:
1.gradle中添加
compile 'org.xutils:xutils:3.3.40'
2.自定義Application
/** * Created by Joe on 2016/9/25. */ public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); x.Ext.init(this); x.Ext.setDebug(BuildConfig.DEBUG); // 是否輸出debug日志, 開(kāi)啟debug會(huì)影響性能. } }
3.清單文件application節(jié)點(diǎn)點(diǎn)添加
android:name=".activitys.MyApp"
上面三步走完接下來(lái)就可以使用了
先寫(xiě)一個(gè)單利類,話不多說(shuō)上代碼
private volatile static XutilsHttp instance; private Handler handler; private XutilsHttp(){ handler = new Handler(Looper.getMainLooper()); } /** * 單利模式 * @return */ public static XutilsHttp getInstance(){ if (instance == null){ synchronized (XutilsHttp.class){ if (instance == null){ instance = new XutilsHttp(); } } } return instance; }
寫(xiě)好接口
//接口回調(diào) public interface XCallBack{ void onResponse(String result); void onFail(String result); } //下載的接口回調(diào) public interface XDownLoadCallBack{ void onstart(); void onLoading(long total,long current,boolean isDownloading); void onSuccess(File result); void onFail(String result); void onFinished(); }
封裝普通get請(qǐng)求
/** * 普通get請(qǐng)求 * @param url * @param maps * @param callback */ public void get(String url, Map<String,String> maps, final XCallBack callback){ RequestParams params = new RequestParams(url); if (null != maps && !maps.isEmpty()){ for (Map.Entry<String,String> entry : maps.entrySet()){ params.addQueryStringParameter(entry.getKey(),entry.getValue()); } } x.http().get(params, new Callback.CommonCallback<String>() { private boolean hasError = false; private String result = null; @Override public void onSuccess(String result) { if (result != null) { this.result = result; } } @Override public void onError(Throwable ex, boolean isOnCallback) { hasError = true; Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show(); } @Override public void onCancelled(CancelledException cex) { } @Override public void onFinished() { if (!hasError && result != null) { onSuccessResponse(result,callback); } } }); }
帶緩存的get請(qǐng)求
/** * 帶緩存數(shù)據(jù)的異步get請(qǐng)求 * @param url * @param maps * @param ifCache 是否緩存 * @param cacheTime 緩存存活時(shí)間 * @param callback */ public void getCache(String url,Map<String,String> maps,final boolean ifCache,long cacheTime,final XCallBack callback){ RequestParams params = new RequestParams(url); params.setCacheMaxAge(cacheTime); if (null != maps && maps.isEmpty()){ for (Map.Entry<String,String> entry : maps.entrySet()){ params.addQueryStringParameter(entry.getKey(),entry.getValue()); } } x.http().get(params, new Callback.CacheCallback<String>() { private boolean hasError = false; private String result = null; @Override public boolean onCache(String result) { if (ifCache && null != result){ this.result = result; } // true: 信任緩存數(shù)據(jù), 不在發(fā)起網(wǎng)絡(luò)請(qǐng)求; false不信任緩存數(shù)據(jù). return ifCache; } @Override public void onSuccess(String result) { if (result != null) { this.result = result; } } @Override public void onError(Throwable ex, boolean isOnCallback) { hasError = true; Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show(); } @Override public void onCancelled(CancelledException cex) { } @Override public void onFinished() { if (!hasError && result != null) { onSuccessResponse(result,callback); } } }); }
普通post請(qǐng)求
/** * 異步post請(qǐng)求 * @param url * @param maps * @param callback */ public void post(String url, Map<String,String> maps, final XCallBack callback){ RequestParams params = new RequestParams(url); if (null != maps && !maps.isEmpty()){ for (Map.Entry<String,String> entry : maps.entrySet()){ params.addBodyParameter(entry.getKey(),entry.getValue()); } } x.http().post(params, new Callback.CommonCallback<String>() { private boolean hasError = false; private String result = null; @Override public void onSuccess(String result) { if (result != null) { this.result = result; } } @Override public void onError(Throwable ex, boolean isOnCallback) { hasError = true; onFailResponse(ex.getMessage(),callback); } @Override public void onCancelled(CancelledException cex) { } @Override public void onFinished() { if (!hasError && result != null) { onSuccessResponse(result,callback); } } }); }
帶緩存的post請(qǐng)求
/** * 帶緩存數(shù)據(jù)的異步post請(qǐng)求 * @param url * @param maps * @param ifCache 是否緩存 * @param cacheTime 緩存存活時(shí)間 * @param callback */ public void postCache(String url,Map<String,String> maps,final boolean ifCache,long cacheTime,final XCallBack callback){ RequestParams params = new RequestParams(url); params.setCacheMaxAge(cacheTime); if (null != maps && maps.isEmpty()){ for (Map.Entry<String,String> entry : maps.entrySet()){ params.addBodyParameter(entry.getKey(),entry.getValue()); } } x.http().get(params, new Callback.CacheCallback<String>() { private boolean hasError = false; private String result = null; @Override public boolean onCache(String result) { if (ifCache && null != result){ this.result = result; } // true: 信任緩存數(shù)據(jù), 不在發(fā)起網(wǎng)絡(luò)請(qǐng)求; false不信任緩存數(shù)據(jù). return ifCache; } @Override public void onSuccess(String result) { if (result != null) { this.result = result; } } @Override public void onError(Throwable ex, boolean isOnCallback) { hasError = true; Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show(); } @Override public void onCancelled(CancelledException cex) { } @Override public void onFinished() { if (!hasError && result != null) { onSuccessResponse(result,callback); } } }); }
文件的下載
/** * 下載文件 * @param url * @param filePath * @param callback */ public void downFile(String url, String filePath, final XDownLoadCallBack callback){ RequestParams params = new RequestParams(url); params.setSaveFilePath(filePath); params.setAutoRename(true); x.http().get(params, new Callback.ProgressCallback<File>() { @Override public void onSuccess(final File result) { //下載完成會(huì)走該方法 handler.post(new Runnable() { @Override public void run() { if (callback!=null){ callback.onSuccess(result); } } }); } @Override public void onError(final Throwable ex, boolean isOnCallback) { handler.post(new Runnable() { @Override public void run() { if (null != callback){ callback.onFail(ex.getMessage()); } } }); } @Override public void onCancelled(CancelledException cex) { } @Override public void onFinished() { handler.post(new Runnable() { @Override public void run() { if (callback!=null){ callback.onFinished(); } } }); } //網(wǎng)絡(luò)請(qǐng)求之前回調(diào) @Override public void onWaiting() { } //網(wǎng)絡(luò)請(qǐng)求開(kāi)始的時(shí)候回調(diào) @Override public void onStarted() { handler.post(new Runnable() { @Override public void run() { if (null != callback){ callback.onstart(); } } }); } //下載的時(shí)候不斷回調(diào)的方法 @Override public void onLoading(final long total, final long current, final boolean isDownloading) { //當(dāng)前進(jìn)度和文件總大小 handler.post(new Runnable() { @Override public void run() { if (callback!=null){ callback.onLoading(total,current,isDownloading); } } }); } }); }
文件的上傳
/** * 文件上傳 * * @param url * @param maps * @param file * @param callback */ public void upLoadFile(String url, Map<String, String> maps, Map<String, File> file, final XCallBack callback) { RequestParams params = new RequestParams(url); if (maps != null && !maps.isEmpty()) { for (Map.Entry<String, String> entry : maps.entrySet()) { params.addBodyParameter(entry.getKey(), entry.getValue()); } } if (file != null) { for (Map.Entry<String, File> entry : file.entrySet()) { params.addBodyParameter(entry.getKey(), entry.getValue().getAbsoluteFile()); } } // 有上傳文件時(shí)使用multipart表單, 否則上傳原始文件流. params.setMultipart(true); x.http().post(params, new Callback.CommonCallback<String>() { @Override public void onSuccess(String result) { onSuccessResponse(result, callback); } @Override public void onError(Throwable ex, boolean isOnCallback) { } @Override public void onCancelled(CancelledException cex) { } @Override public void onFinished() { } }); }
上傳Json字符串到服務(wù)器
/** * 上傳Json串到服務(wù)器 * @param url * @param maps 將需要傳的各個(gè)參數(shù)放在Map集合里面 */ public void upLoadJson(String url, Map<String, String> maps, final XCallBack callback){ JSONObject js_request = new JSONObject();//服務(wù)器需要傳參的json對(duì)象 try { for (Map.Entry<String,String> entry : maps.entrySet()){ js_request.put(entry.getKey(),entry.getValue()); } } catch (JSONException e) { e.printStackTrace(); } RequestParams params = new RequestParams(url); params.setAsJsonContent(true); params.setBodyContent(js_request.toString()); x.http().post(params, new Callback.CommonCallback<String>() {//發(fā)起傳參為json的post請(qǐng)求, // Callback.CacheCallback<String>的泛型為后臺(tái)返回?cái)?shù)據(jù)的類型, // 根據(jù)實(shí)際需求更改 private boolean hasError = false; private String result = null; @Override public void onSuccess(String result) { if (result != null) { this.result = result; } } @Override public void onError(Throwable ex, boolean isOnCallback) { ex.printStackTrace(); } @Override public void onCancelled(CancelledException cex) { } @Override public void onFinished() { if (!hasError && result != null && callback!=null) { onSuccessResponse(result,callback); } } }); }
使用案例:
下載調(diào)用:
XutilsHttp.getInstance().downFile(url, Utils.getSDPath() + "/" + "ShopBox_Guide_Video/" + Utils.getFileName(url), new XutilsHttp.XDownLoadCallBack() { @Override public void onstart() { showDialog(DIALOG_DOWNLOAD_PROGRESS); } @Override public void onLoading(long total, long current, boolean isDownloading) { //當(dāng)前進(jìn)度和文件總大小 mProgressDialog.setMax((int) total); mProgressDialog.setProgress((int) current); } @Override public void onSuccess(File result) { //下載完成會(huì)走該方法 playMedia(result.getPath()); } @Override public void onFail(String result) { Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show(); } @Override public void onFinished() { dismissDialog(DIALOG_DOWNLOAD_PROGRESS); } });
帶緩存get請(qǐng)求
XutilsHttp.getInstance().postCache(url, null, true, 60000, new XutilsHttp.XCallBack() { @Override public void onResponse(String result) { // 成功獲取數(shù)據(jù) } @Override public void onFail(String result) { Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show(); } });
就是這么簡(jiǎn)單,不足之處請(qǐng)大家多多指點(diǎn)
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
android TextView中識(shí)別多個(gè)url并分別點(diǎn)擊跳轉(zhuǎn)方法詳解
在本篇文章里小編給大家整理的是關(guān)于android TextView中識(shí)別多個(gè)url并分別點(diǎn)擊跳轉(zhuǎn)方法詳解,需要的朋友們可以學(xué)習(xí)參考下。2019-08-08Android App更改應(yīng)用的圖標(biāo)的實(shí)現(xiàn)方法
這篇文章主要介紹了Android App更改應(yīng)用的圖標(biāo)的實(shí)現(xiàn)方法的相關(guān)資料,主要是通過(guò)入口Activity android:icon="@drawable/new_app_icon" 指向新的應(yīng)用圖標(biāo),需要的朋友可以參考下2017-08-08Android利用二階貝塞爾曲線實(shí)現(xiàn)添加購(gòu)物車(chē)動(dòng)畫(huà)詳解
這篇文章主要給大家介紹了關(guān)于Android利用二階貝塞爾曲線實(shí)現(xiàn)添加購(gòu)物車(chē)動(dòng)畫(huà)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android開(kāi)發(fā)者具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08利用Flutter實(shí)現(xiàn)背景圖片毛玻璃效果實(shí)例
Flutter沒(méi)有單獨(dú)的模糊處理容器,需要部件層層疊加實(shí)現(xiàn)模糊效果,下面這篇文章主要給大家介紹了關(guān)于利用Flutter實(shí)現(xiàn)背景圖片毛玻璃效果的相關(guān)資料,需要的朋友可以參考下2022-06-06RxJava 1升級(jí)到RxJava 2過(guò)程中踩過(guò)的一些“坑”
RxJava2相比RxJava1,它的改動(dòng)還是很大的,那么下面這篇文章主要給大家總結(jié)了在RxJava 1升級(jí)到RxJava 2過(guò)程中踩過(guò)的一些“坑”,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下來(lái)要一起看看吧。2017-05-05Android 使用SwipeRefreshLayout控件仿抖音做的視頻下拉刷新效果
這篇文章主要介紹了Android 使用SwipeRefreshLayout控件仿抖音做的視頻下拉刷新效果,需要的朋友可以參考下2018-05-05Android實(shí)用圖文教程之代碼混淆、第三方平臺(tái)加固加密、渠道分發(fā)
這篇文章主要介紹了Android實(shí)用圖文教程之代碼混淆、第三方平臺(tái)加固加密、渠道分發(fā),需要的朋友可以參考下2014-12-12