如果开发一个和服务端有数据交互android应用,流程通常是这样的:界面收集用户数据之后,将它转换成JSON或者XML格式的字符串,以HTTP的方式提交给服务端,获得返回的文本数据,再将数据解析为java对象,参看这位朋友的博文《android通过httpClient请求获取JSON数据并且解析》。对于复杂的应用,JSON数据的字段会很多,那数据解析的那段代码就会很长。能不能封装这个流程,让开发人员只关注业务逻辑呢?用Spring For Android可以做到这一点。
  Spring For Android是Spring框架的一个扩展,主要目的在简化Android本地应用的开发。 官方网址:http://www.springsource.org/spring-android

  1 使用RestTemplate来为你的Android客户端提供REST服务

  2 提供了跟其它诸如Twitter和Facebook等社交网络的集成与OAuth授权客户端等等

  本文章讨论的是RestTemplate的使用,第二项功能就不介绍了。

下面以用户登录的例子,给大家介绍spring for android如何使用:

1  引入必须的JAR

jaskson-core和jackson-mappper用来解析和自动映射json数据,在官方网址可以下载到

2  先看android客户端代码

LoginMessage message = new LoginMessage(username,password);
MemberMessage responseMessage =RestTemplateManager.postJSON(Urls.LOGIN_URL, message, MemberMessage.class);

LoginMessage是一个普通的Java bean, 它包含了一个登录所需的用户名(loginName)和密码(passsword),MemberMessage 也是一个普通的Java bean,l里面包含了用户基本信息.RestTemplateManager.postJSON()会将LoginMessage对象自动转化为json格式的数据,并以https post方式送出,再将服务端返回的结果转化为MemberMessage对象.

让我们在看看RestTemplateManager的代码(注意红色字体部分)

public class RestTemplateManager {
private static final int CONNECT_TIMEOUT = 30000;// 30秒
private static final int READ_TIMEOUT = 15000;// 15秒
private static final String TAG = "RestTemplateManager";
private static SimpleClientHttpRequestFactory simpleFactory;
private static HttpComponentsClientHttpRequestFactory httpComponentsFactory;
private static HttpHeaders httpHeaders = new HttpHeaders();
static {
simpleFactory = new SimpleClientHttpRequestFactory();
simpleFactory.setConnectTimeout(CONNECT_TIMEOUT);
simpleFactory.setReadTimeout(READ_TIMEOUT); httpComponentsFactory = new HttpComponentsClientHttpRequestFactory();
httpComponentsFactory.setConnectTimeout(CONNECT_TIMEOUT);
httpComponentsFactory.setReadTimeout(READ_TIMEOUT);
} /**
* 请求头里面加入验证字符串
*
* @param extra
*/
public static void setHttpHeaders(String extra) {
httpHeaders.add("verify", extra);
} public static ClientHttpRequestFactory getResquestFactory() {
// 当SDK版本号为大于2.3时
if (Build.VERSION.SDK_INT >= 9) {
return simpleFactory;
}
return httpComponentsFactory;
} /**
* POST请求
*
* @param url
* @param msg
* @param clazz
* @return
*/
public static <R, M> R postJSON(String url, M msg, Class<R> clazz) {
try {
Log.v(TAG, url);
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<M> requestEntity = new HttpEntity<M>(msg, httpHeaders);
RestTemplate restTemplate = new RestTemplate(getResquestFactory());
ResponseEntity<R> response = restTemplate.exchange(url, HttpMethod.POST, requestEntity, clazz);
return response.getBody();
} catch (Exception e) {
e.printStackTrace();
}
return null;
} public static <R> R getJSON(String url, Class<R> clazz, Object... uriVariables) {
try {
url = spliceRestURL(url, uriVariables);
Log.v(TAG, url);
HttpEntity<?> requestEntity = new HttpEntity<Object>(httpHeaders);
RestTemplate restTemplate = new RestTemplate(getResquestFactory());
ResponseEntity<R> responseEntity = restTemplate.exchange(url, HttpMethod.GET, requestEntity, clazz,
uriVariables);
return responseEntity.getBody();
} catch (Exception e) {
e.printStackTrace();
}
return null;
} /**
* 拼接rest风格的URL,注意参数的顺序
*/
public static String spliceRestURL(String prefix, Object... params) {
StringBuilder builder = new StringBuilder(prefix);
for (Object p : params) {
builder.append("/").append(p);
}
return builder.toString();
} }

postJSON和getJSON方法封装了http请求和JSON数据解析,开发人员只要定义合适的数据对象和处理好业务流程即可。

3 服务端的代码(springMVC演示)

    @RequestMapping(value = "login", method = RequestMethod.POST, produces = "application/json")
@ResponseBody
public MemberMessage login(@RequestBody LoginMessage message) {
MemberMessage result = new MemberMessage();
//登录过程处理.......
return result;
}

springmvc收到LoginMessage对象处理了登录流程之后,再将结果对象MemberMessage转化为JSON数据

MemberMessage和LoginMessage两个对象在服务端和客户端是重用的,如果你的服务端是Java项目,使用这个组件就更便利了。

这个框架已经用在了公司的客户端上,几乎所有的数据请求都用它。

[Android]使用Spring for Android改善数据交互流程的更多相关文章

  1. Android Activity切换与Activity间数据交互

    在Android程序内部, startActivity借助Intent来启动一个子Activity(使用父子关系进行表述,只为表达清晰,Android中并未有父子Activity的概念).如下: In ...

  2. Spring MVC之JSON数据交互和RESTful的支持

    1.JSON概述 1.1 什么是JSON JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式.它是基于JavaScript的一个子集,使用了C.C ...

  3. Android 5.1 open data flow 数据开启流程

    首先我们来看看下面的关系图: 底层Settings.apk 在Settings -> Data Usage Summary中的某个SIM tab下开启数据开关 android/packages/ ...

  4. Spring MVC前后端数据交互总结

    控制器 作为控制器,大体的作用是作为V端的数据接收并且交给M层去处理,然后负责管理V的跳转.SpringMVC的作用不外乎就是如此,主要分为:接收表单或者请求的值,定义过滤器,跳转页面:其实就是ser ...

  5. mina中游戏客户端服务端数据交互流程

    ====================================================================================CLIENT    encode ...

  6. android实现两个activity数据交互

    android如何实现两个Activity数据交互?主要是根据Intent的携带功能,intent可以携带很多信息,比如Bundle,URI甚至对象(此时要序列化,并且对象里面的成员变量如果是对象,也 ...

  7. Android客户端和服务器端数据交互

    网上有很多例子来演示Android客户端和服务器端数据如何实现交互不过这些例子大多比较繁杂,对于初学者来说这是不利的,现在介绍几种代码简单.逻辑清晰的交互例子,本篇博客介绍第四种: 一.服务器端: 代 ...

  8. android中的HttpURLConnection和HttpClient实现app与pc数据交互

    自学android的这几天很辛苦,但是很满足,因为每当学到一点点知识点都会觉得很开心,觉得今天是特别有意义的,可能这个就是一种莫名的热爱吧. 下面来说说今天学习的HttpURLConnection和H ...

  9. Spring MVC返回json数据给Android端

    原先做Android项目时,服务端接口一直是别人写的,自己拿来调用一下,但下个项目,接口也要自己搞定了,我想用Spring MVC框架来提供接口,这两天便抽空浅学了一下该框架以及该框架如何返回json ...

随机推荐

  1. 浮点数运算的精度问题:以js语言为例

    在 JavaScript 中整数和浮点数都属于 Number 数据类型,所有数字都是以 64 位浮点数形式储存,即便整数也是如此. 所以我们在打印 1.00 这样的浮点数的结果是 1 而非 1.00  ...

  2. 利用fastjson解析json并通过js&ajax实现页面的无跳转刷新

    1.json是一种优秀的数据格式,在移动开发和web开发中经常用到,本例中通过一个小案例讲解如何通过alibaba的开源框架fastjson来解析jason数据格式并通过js实现无跳转刷新 2,新建一 ...

  3. Android读写properties配置文件

    写这篇文章之前可以成功运行,文章后就各种找不到文件.所以并没有采用此种方式,后期完善.详见下篇解决方案. 配置文件读取很容易,修改需要注意权限,比如assets目录下就不允许修改. 配置文件的创建: ...

  4. ELK对Tomcat日志双管齐下-告警触发/Kibana日志展示

    今天我们来聊一聊Tomcat,相信大家并不陌生,tomcat是一个免费开源的web应用服务器,属于轻量级的应用程序,在小型生产环境和并发不是很高的场景下被普遍使用,同时也是开发测试JSP程序的首选.也 ...

  5. net core体系-web应用程序-4asp.net core2.0 项目实战(任务管理系统)-2项目搭建

    系统要求 首先建议采用 Windows 10 专业版/企业版/教育版,且必须是64位操作系统,原因是docker装起来比较方便,Win7装起来比较麻烦,且不确定是否有其他问题(自己没有实践过) 其次W ...

  6. SparkCore | Rdd| 广播变量和累加器

    Spark中三大数据结构:RDD:  广播变量: 分布式只读共享变量: 累加器:分布式只写共享变量: 线程和进程之间 1.RDD中的函数传递 自己定义一些RDD的操作,那么此时需要主要的是,初始化工作 ...

  7. Mapreduce中maptask过程详解

    一.Maptask并行度与决定机制 1.一个job任务的map阶段的并行度默认是由该任务的大小决定的: 2.一个split切分分配一个maprask来并行处理: 3.默认情况下,split切分的大小等 ...

  8. webpack报错运行时没有定义

    一.问题描述 ReferenceError: regeneratorRuntime is not defined 二.问题分析 缺少regenerator的运行时库,具体原理,可查看babel文章. ...

  9. php curl 跨域情趣

    function curl_post($url='',$postdata='',$options=array()){ $ch=curl_init($url); curl_setopt($ch,CURL ...

  10. angularjs 初始化方法执行两次以及url定义错误导致传值错误问题

    1.初始化方法执行两次以上的问题定义一个 route.如下所示:.state('main.channelQryDetail', { url:'/channelDetail/:channelNo/:pa ...