Xutils3网络请求的封装详解

封装了一个Xutil3的网络请求工具类,分享给大家,本人水平有限,不足之处欢迎指出。

使用前先配置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日志, 开启debug会影响性能.

}

}

3.清单文件application节点点添加

android:name=".activitys.MyApp"

上面三步走完接下来就可以使用了

先写一个单利类,话不多说上代码

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;

}

写好接口

//接口回调

public interface XCallBack{

void onResponse(String result);

void onFail(String result);

}

//下载的接口回调

public interface XDownLoadCallBack{

void onstart();

void onLoading(long total,long current,boolean isDownloading);

void onSuccess(File result);

void onFail(String result);

void onFinished();

}

封装普通get请求

/**

* 普通get请求

* @param url

* @param maps

* @param callback

*/

public void get(String url, Map maps, final XCallBack callback){

RequestParams params = new RequestParams(url);

if (null != maps && !maps.isEmpty()){

for (Map.Entry entry : maps.entrySet()){

params.addQueryStringParameter(entry.getKey(),entry.getValue());

}

}

x.http().get(params, new Callback.CommonCallback() {

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请求

/**

* 带缓存数据的异步get请求

* @param url

* @param maps

* @param ifCache 是否缓存

* @param cacheTime 缓存存活时间

* @param callback

*/

public void getCache(String url,Map 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 entry : maps.entrySet()){

params.addQueryStringParameter(entry.getKey(),entry.getValue());

}

}

x.http().get(params, new Callback.CacheCallback() {

private boolean hasError = false;

private String result = null;

@Override

public boolean onCache(String result) {

if (ifCache && null != result){

this.result = result;

}

// true: 信任缓存数据, 不在发起网络请求; false不信任缓存数据.

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请求

/**

* 异步post请求

* @param url

* @param maps

* @param callback

*/

public void post(String url, Map maps, final XCallBack callback){

RequestParams params = new RequestParams(url);

if (null != maps && !maps.isEmpty()){

for (Map.Entry entry : maps.entrySet()){

params.addBodyParameter(entry.getKey(),entry.getValue());

}

}

x.http().post(params, new Callback.CommonCallback() {

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请求

/**

* 带缓存数据的异步post请求

* @param url

* @param maps

* @param ifCache 是否缓存

* @param cacheTime 缓存存活时间

* @param callback

*/

public void postCache(String url,Map 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 entry : maps.entrySet()){

params.addBodyParameter(entry.getKey(),entry.getValue());

}

}

x.http().get(params, new Callback.CacheCallback() {

private boolean hasError = false;

private String result = null;

@Override

public boolean onCache(String result) {

if (ifCache && null != result){

this.result = result;

}

// true: 信任缓存数据, 不在发起网络请求; false不信任缓存数据.

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() {

@Override

public void onSuccess(final File result) {

//下载完成会走该方法

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();

}

}

});

}

//网络请求之前回调

@Override

public void onWaiting() {

}

//网络请求开始的时候回调

@Override

public void onStarted() {

handler.post(new Runnable() {

@Override

public void run() {

if (null != callback){

callback.onstart();

}

}

});

}

//下载的时候不断回调的方法

@Override

public void onLoading(final long total, final long current, final boolean isDownloading) {

//当前进度和文件总大小

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 maps, Map file, final XCallBack callback) {

RequestParams params = new RequestParams(url);

if (maps != null && !maps.isEmpty()) {

for (Map.Entry entry : maps.entrySet()) {

params.addBodyParameter(entry.getKey(), entry.getValue());

}

}

if (file != null) {

for (Map.Entry entry : file.entrySet()) {

params.addBodyParameter(entry.getKey(), entry.getValue().getAbsoluteFile());

}

}

// 有上传文件时使用multipart表单, 否则上传原始文件流.

params.setMultipart(true);

x.http().post(params, new Callback.CommonCallback() {

@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字符串到服务器

/**

* 上传Json串到服务器

* @param url

* @param maps 将需要传的各个参数放在Map集合里面

*/

public void upLoadJson(String url, Map maps, final XCallBack callback){

JSONObject js_request = new JSONObject();//服务器需要传参的json对象

try {

for (Map.Entry 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() {//发起传参为json的post请求,

// Callback.CacheCallback的泛型为后台返回数据的类型,

// 根据实际需求更改

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);

}

}

});

}

使用案例:

下载调用:

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) {

//当前进度和文件总大小

mProgressDialog.setMax((int) total);

mProgressDialog.setProgress((int) current);

}

@Override

public void onSuccess(File result) {

//下载完成会走该方法

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请求

XutilsHttp.getInstance().postCache(url, null, true, 60000, new XutilsHttp.XCallBack() {

@Override

public void onResponse(String result) {

// 成功获取数据

}

@Override

public void onFail(String result) {

Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();

}

});

就是这么简单,不足之处请大家多多指点

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

android xutils json请求,Android Xutils3网络请求的封装详解及实例代码相关推荐

  1. android 动态水球,Canvas 制作动态进度加载水球详解及实例代码

    Canvas 动态进度加载水球 前言 之前看到一些球型的动态加载的效果,一直想自己动手做一个,正好这段时间重温了一个Canvas,所以就尝试了一下. 实现思路 关于水波的实现,使用了sin()函数,通 ...

  2. Android 轻松实现语音识别详解及实例代码

    使用Intent调用语音识别程序 说明 Android中主要通过RecognizerIntent来实现语音识别,其实代码比较简单,但是如果找不到语音识别设备,就会抛出异常 ActivityNotFou ...

  3. android 设置listview滚动条,Android ListView 滚动条的设置详解及实例代码

    Android ListView 滚动条的设置详解 1.滚动条的属性 android:scrollbarAlwaysDrawHorizontalTrack 设置是否始终显示水平滚动条.这里用Scrol ...

  4. android message 代码,Android Handler移除Message详解及实例代码

    Android Handler移除Message详解 问题: 1.removeMessage(what)函数是否只能移除对应what值的Message? 2.对于Delayed发送的Message,能 ...

  5. Android为spinner设置适配器,Android Spinner与适配器模式详解及实例代码

    最近做项目对Android Spinner 使用,这里简单写个小例子,来测试如何使用. Spinner 是一个下拉列表,往安卓界面中拖拽一个Spinner控件,在属性中设置Android:entrie ...

  6. android 动态改变语言,Android-国际化(多语言)切换详解及实例

    internationalization(国际化)简称 i18n,因为在i和n之间还有18个字符,localization(本地化),简称L10n. 一.原理: Android中实现国际化相对来说还是 ...

  7. php ajax json 实例,php+ajax+json 详解及实例代码

    php+ajax+json 实例代码 html页面: $(function(){ $("#send").click(function(){ var cont = $("i ...

  8. ResNet残差网络及变体详解(符代码实现)

    本文通过分析深度网络模型的缺点引出ResNet残差网络,并介绍了几种变体,最后用代码实现ResNet18. 文章目录 前言 模型退化 残差结构 ResNet网络结构 Pre Activation Re ...

  9. input组件android,React-Native TextInput组件详解及实例代码

    同时适配Android和IOS 代码注释比较详细 /** * Sample React Native App * https://github.com/facebook/react-native * ...

最新文章

  1. 服务器怎么修复插件,如何修复服务器状态代码:302由SQL发现我注入了Firefox插件...
  2. java制定年月日第几天_(JAVA)输入年月日,计算日期是今年的第几天?
  3. 安装“消息队列 (MSMQ)”
  4. 百年来,清华为何都没有培养出诺贝尔奖得主?
  5. java的标识符可以以数字开头_标识符可以以数字开头,但不能是Java中的关键字...
  6. 结合工作经历推荐新手编程语言
  7. ajax全局加密,Ajax请求接口加密研究(针对网页前端的接口安全加密机制研究)...
  8. 更新 FF.PyAdmin v1.2
  9. Amazon上是如何对小说进行分类的呢?网文出海小说APP可借鉴参考的点有哪些?
  10. 在短短几分钟内用冰柱构建超快速PHP服务器
  11. c语言用分支结构判断最大字符,第3章C语言 分支结构PPT课件.ppt
  12. 华图教育_南京_前端实习面试
  13. 地铁怎么坐才不能做反_[第一次]第一次一个人坐地铁,我坐反了方向
  14. 深圳首辆数字人民币主题观光巴士亮相
  15. 易语言c源码流程图怎么实现,易语言APC内存注入主要流程源码
  16. Word2Vec增量训练实现
  17. android通讯录实例(一)
  18. 卓有成效的管理者总结与思考
  19. datastage 函数_Datastage 中Transformer Stage:各个函数的解析
  20. jquery设置checkbox为checked状态不改变的解决办法

热门文章

  1. 视觉图神经网络:Vision GNN
  2. 脚本录制软件python 按键精灵 tc_如何使用按键精灵录制脚本
  3. 专利费减备案操作流程——让你申请专利时的官费大大打折
  4. [ERP]ERP项目管理的利器——“均衡”之道
  5. printf()、sprintf()、vprintf()、vsprintf()、有符号|无符号数
  6. qq2007与win2003server sp2不兼容,死机的解决
  7. java计算机毕业设计家政服务管理系统源码+mysql数据库+系统+lw文档+部署
  8. C++实现简单生产者消费者模型
  9. 2018大幕渐开 智慧城市和安防市场不容小觑
  10. Spring Boot入门二:Spring Boot版本;