Android Xutils3网络请求的封装详解及实例代码
作者:lqh 发布时间:2021-07-20 20:27:49
标签:Android,Xutils3,网络
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<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请求
/**
* 带缓存数据的异步get请求
* @param url
* @param maps
* @param ifCache 是否缓存
* @param cacheTime 缓存存活时间
* @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: 信任缓存数据, 不在发起网络请求; 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<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请求
/**
* 带缓存数据的异步post请求
* @param url
* @param maps
* @param ifCache 是否缓存
* @param cacheTime 缓存存活时间
* @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: 信任缓存数据, 不在发起网络请求; 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<File>() {
@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<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());
}
}
// 有上传文件时使用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字符串到服务器
/**
* 上传Json串到服务器
* @param url
* @param maps 将需要传的各个参数放在Map集合里面
*/
public void upLoadJson(String url, Map<String, String> maps, final XCallBack callback){
JSONObject js_request = new JSONObject();//服务器需要传参的json对象
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>() {//发起传参为json的post请求,
// Callback.CacheCallback<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) {
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();
}
});
就是这么简单,不足之处请大家多多指点
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
0
投稿
猜你喜欢
- @ConfigurationProperties作用:用于获取配置文件中的属性定义并绑定到javaBean属性中举个栗子:配置文件mycar
- 在我们现在开发APP过程中,当用户注册时,短信验证是必不可少的操作,这里我们就是用一个免费的第三方短信验证SDK-MOP首先看下效果图 获取
- 最近都在忙着写一个网站项目,今天做一个分页功能的时候,遇到了分页效果实现不了的问题,查了好久的资料,后来终于是成功解决啦,记录一下1.在po
- 昨天实现一个功能,根据文章的id或者别名查找文章。起初采用mybatis的Example进行查询,对参数artName进行判断,如果是纯数字
- 公司的老项目要改造多租户,于是进入了大坑,本文写点遇到的坑以及解决方案,每次遇到问题在网上搜了好久,记录下来,防止以后忘掉。(一).方案网上
- 问题现象前段时间升级 Android Studio 3.1.3+ 版本后,决定尝试使用 Kotlin 做 APP 开发看看。结果却发现,修改
- 一:想都不用想的,有图有真相,看着爽了,在看下面源码二:实例源码分析①:首先定义接口package com.demo.tools.view;
- 排序算法介绍排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。排序的分类:1) 内部排序:指将
- 在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择。这些功能我们叫它Android Di
- 在 Android 的一些界面中,有时候我们需要为一副图片生成大小为 n * n 的缩略图,有时候需要的缩略图特殊一些,比如:1、带圆角的缩
- 概述本文介绍 Spring Boot 项目中整合 ElasticSearch 并实现 CRUD 操作,包括分页、滚动等功能。添加Maven依
- 写在前面:spring 应该对于每个从事java开发的大兄弟们来说应该都不陌生的,作为一个从业两年多的小开发仔,个人觉得,每天都在面对spr
- java操作json对象出现StackOverflow错误今天在做项目的时候,遇到一个非常怪异的问题。一个java实体类中存在多个属性,每一
- C语言是高级语言,它的语法接近于人类的自然语言,但比自然语言严谨。计算机无法直接将C语言的代码运行,他们并不懂得什么是C语言,实际上,计算机
- 本文实例讲述了Java字符流与字节流区别与用法。分享给大家供大家参考,具体如下:字节流与字符流主要的区别是他们的的处理方式流分类:1.Jav
- 将SuperSocket封装成类库之后可以将其集成进各种类型的应用,而不仅仅局限于控制台应用程序了,从而应用于不同的场景。这里以Telnet
- Idea中directory和package的区别,要是错了就右键,make directory as 目录或者源代码目录(Source R
- 前言植物大战僵尸的数据文件是存储在本地的dat文件当中,修改在本地的dat文件就可以修改到游戏中的数据。之前使用二进制编码工具Hex Edi
- Android5.0之后提供了JobService和JobScheduler,用于在稍后的某个时间点或者当满足某个特定的条件时执行一个任务
- 一、首先编写一个工具类Hello:public class Hello { public static void say(Str