借助volley、Gson类库。

优点

网络请求集中处理,返回值直接为预期的对象,不需要手动反序列,提高效率,使用时建立好model类即可。

使用效果

DataProess.Request(true, context,
Request.Method.GET,
DataApis.CTenantAdsUrl + "73213f9c-e695-420d-9398-2cc9fc2b8492",
null,
new DataCallback<List<TenantAdsModel>>() {
//Java的泛型会类型擦除,只能在外部直接传递进去。虽然内部可以通过子类new泛型对象方式,但是这种实现感觉不够优美。Gson使用了反射进行泛型类型获取,之后改进可以考虑。非List返回类型可以重载getClassHelper()直接传递类型class。
@Override
public Type getTypeHelper() {
return new TypeToken<List<TenantAdsModel>>() {
}.getType();
} @Override
public void CallBack(List<TenantAdsModel> data) {
//后续操作
}
} @Override
public void ErrorCallBack(int statusCode, String s) {
alertDialog.show();
} @Override
public void FinallyCallBack() {
//自写进度控制Util,可以多次show,在对应次数hide后或超时才隐藏。这样即可不用考虑多个数据请求的问题,都完成才会消除进度条。
ProgressUtil.hide();
}
}
);

实现

首先是DataCallback:

public class DataCallback<DataType> {
final static GsonBuilder builder = new GsonBuilder(); public final <T> T ConvertData(String oData, Type type) {
Gson gson = builder.setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create(); return gson.fromJson(oData, type);
} public final <T> T ConvertData(String oData, Class<T> cl) {
Gson gson = builder.setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create(); return gson.fromJson(oData, cl);
} public Type getTypeHelper() {
return null;
} public Class<DataType> getClassHelper() {
return null;
} public void StringCallBack(String data) {
Type type = getTypeHelper();
Class<DataType> cl = getClassHelper();
DataType dt = null;
try {
if (type != null) dt = ConvertData(data, type);
if (cl != null) dt = ConvertData(data, cl);
if (dt != null) {
CallBack(dt);
} else {
ErrorCallBack(-3, null);
}
} catch (Exception ex) {
ErrorCallBack(-2, "callBack");
}
} public void CallBack(DataType data) { } public void ErrorCallBack(int statusCode, String s) { } public void FinallyCallBack() { }
}

核心处理类:

服务器端采用OAuth Password Flow鉴权,使用Authorization头就好。鉴权失败事件使用的是自写的事件机制

public class DataProess {
final static String AppToken = "Basic VXBwV2luQXBwOjF5N09jSUN4d3F5YUNSVWE3dVVBeFc5c3AzdVRubU9JbW9IY3JocDdUOWM=";
final static GsonBuilder gsonBuilder = new GsonBuilder();
static LruCache<String, Object> lruCache = new LruCache<String, Object>(20);
static String UserToken = ""; public static EventTrans<String> AuthFailed = new EventTrans<String>(); public static String getUserToken() {
return UserToken;
} public static void setUserToken(String userToken) {
UserToken = userToken;
} public void ClearCache() {
lruCache = new LruCache<String, Object>(20);
} public static void Request(
final boolean useCache,
final Context context,
final int method,
final String url,
final Object data,
final DataCallback dc) {
RequestQueue requestQueue = Volley.newRequestQueue(context); if (useCache) {
String cachedata = (String) lruCache.get(method + url);
if (cachedata != null) {
dc.StringCallBack(cachedata);
dc.FinallyCallBack();
return;
}
}
final StringRequest stringRequest = new StringRequest(
method,
url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
if (useCache) lruCache.put(method + url, response);
dc.StringCallBack(response);
dc.FinallyCallBack();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError arg0) {
System.out.println("sorry,Error " + arg0.toString());
int sc = -1;
if (arg0.networkResponse != null) {
sc = arg0.networkResponse.statusCode;
if (sc == 401) {
UserToken = "";
AuthFailed.trigger(this, null);
} try {
String data = new String(arg0.networkResponse.data,
HttpHeaderParser.parseCharset(arg0.networkResponse.headers));
System.out.println("sorry,Error " + data);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
dc.ErrorCallBack(sc, arg0.toString());
dc.FinallyCallBack();
}
}
) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
if (StringUtil.isEmpty(UserToken)) {
params.put("Authorization", AppToken);
} else {
params.put("Authorization", UserToken);
}
return params;
} @Override
public String getBodyContentType() {
return "application/json";
} @Override
public byte[] getBody() throws AuthFailureError {
Gson gson = gsonBuilder.setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create(); String str = gson.toJson(data);
if (StringUtil.isEmpty(str)) return null;
return str.getBytes();
}
};
requestQueue.add(stringRequest);
}
}

Android,适合Restful网络请求封装的更多相关文章

  1. flutter dio网络请求封装实现

    flutter dio网络请求封装实现 文章友情链接:   https://juejin.im/post/6844904098643312648 在Flutter项目中使用网络请求的方式大致可分为两种 ...

  2. 基于Android Volley的网络请求工具

    基于Android Volley的网络请求工具. 一.说明 AndroidVolley,Android Volley核心库及扩展工程.AndroidVolleySample,网络请求工具示例工程.Re ...

  3. (转载)Android之三种网络请求解析数据(最佳案例)

    [置顶] Android之三种网络请求解析数据(最佳案例) 2016-07-25 18:02 4725人阅读 评论(0) 收藏 举报  分类: Gson.Gson解析(1)  版权声明:本文为博主原创 ...

  4. React-Native 之 GD (八)GET 网络请求封装

    1.到这里,相信各位对 React-Native 有所熟悉了吧,从现在开始我们要慢慢往实际的方向走,这边就先从网络请求这部分开始,在正式开发中,网络请求一般都单独作为一部分,我们在需要使用的地方只需要 ...

  5. 十. Axios网络请求封装

    1. 网络模块的选择 Vue中发送网络请求有非常多的方式,那么在开发中如何选择呢? 选择一:传统的Ajax是基于XMLHttpRequest(XHR) 为什么不用它呢?非常好解释配置和调用方式等非常混 ...

  6. Android项目开发全程(三)-- 项目的前期搭建、网络请求封装是怎样实现的

    在前两篇博文中已经做了铺垫,下面咱们就可以用前面介绍过的内容开始做一个小项目了(项目中会用到Afinal框架,不会用Afinal的童鞋可以先看一下上一篇博文),正所谓麻雀虽小,五脏俱全,这在里我会尽量 ...

  7. [转]Android各大网络请求库的比较及实战

    自己学习android也有一段时间了,在实际开发中,频繁的接触网络请求,而网络请求的方式很多,最常见的那么几个也就那么几个.本篇文章对常见的网络请求库进行一个总结. HttpUrlConnection ...

  8. Android 几种网络请求的区别与联系

    HttpUrlConnection 最开始学android的时候用的网络请求是HttpUrlConnection,当时很多东西还不知道,但是在android 2.2及以下版本中HttpUrlConne ...

  9. android -------- OkGo (让网络请求更简单的框架)

    项目地址:https://github.com/jeasonlzy 该库是封装了okhttp的网络框架,可以与RxJava完美结合,比Retrofit更简单易用.支持大文件上传下载,上传进度回调,下载 ...

随机推荐

  1. Gradle配置APK自动签名完整流程

    转载请注明出处:http://www.cnblogs.com/LT5505/p/6256683.html 一.生成签名 1.命令行生成签名,输入命令keytool -genkey -v -keysto ...

  2. C# MVC 5 - 生命周期(应用程序生命周期&请求生命周期)

    本文是根据网上的文章总结的. 1.介绍 本文讨论ASP.Net MVC框架MVC的请求生命周期. MVC有两个生命周期,一为应用程序生命周期,二为请求生命周期. 2.应用程序生命周期 应用程序生命周期 ...

  3. Vue.js 2.0 和 React、Augular等其他框架的全方位对比

    引言 这个页面无疑是最难编写的,但也是非常重要的.或许你遇到了一些问题并且先前用其他的框架解决了.来这里的目的是看看Vue是否有更好的解决方案.那么你就来对了. 客观来说,作为核心团队成员,显然我们会 ...

  4. Android数据加密之SHA安全散列算法

    前言: 对于SHA安全散列算法,以前没怎么使用过,仅仅是停留在听说过的阶段,今天在看图片缓存框架Glide源码时发现其缓存的Key采用的不是MD5加密算法,而是SHA-256加密算法,这才勾起了我的好 ...

  5. 第一个移动前端开源项目-dailog

    你还在为手机上没有忙碌光标而发愁吗?你还在抱怨弹出框组件要依赖zepto/jqery吗?你还在纠结是否要自己写一套还是去网上寻找成现成的UI组件吗?YouA为你轻松解决所有烦恼.YouA是我为移动前端 ...

  6. python中IndentationError: expected an indented block错误的解决方法

    IndentationError: expected an indented block 翻译为IndentationError:预期的缩进块 解决方法:有冒号的下一行要缩进,该缩进就缩进

  7. BPM与 SAP & Oracle EBS集成解决方案分享

    一.需求分析 SAP和Oracle EBS都是作为全球顶级的的ERP产 品,得到了众多客户的青睐.然而由于系统庞大.价格昂贵以及定位不同,客户在实施过程中经常会面临以下困惑: 1.SAP如何实现&qu ...

  8. 将css和js缓存到localStorage缓存,提高网页响应速度

    适用于小站点,这很极致,很快速~~ /** * Created by SevenNight on 2016/9/21 0021. * 插件功能:使用localStorage缓存js和css文件,减少h ...

  9. Immutable(不可变)集合

    不可变集合,顾名思义就是说集合是不可被修改的.集合的数据项是在创建的时候提供,并且在整个生命周期中都不可改变. 为什么要用immutable对象?immutable对象有以下的优点: 对不可靠的客户代 ...

  10. smartcrop.js智能图片裁剪库

    今天将为大家介绍一款近期github上很不错的开源库 – smartcrop.js.它是一款图片处理的智能裁剪库.在很多项目开发中,经常会遇见上传图片的场景,它可能是用户照片信息,也可能是商品图片等. ...