浅谈Androidclient项目框架
写Android也有些时间了,一边工作,一边学习,一边积累。仅仅有遇到问题了,花时间去研究,自己的能力才干提升。刀假设不用。慢慢的就会生锈应该也是这个道理吧!上个月公司项目server框架进行的一些调整。可是当时自己的项目没有移植框架。还是前人的代码,一下子差点没把我搞死,真是筋疲力尽。一个周末两天所有加班赶,结果赶出来的质量还很差,等改完了之后大概稳定下来。自己赶紧抽闲余时间把自己的框架移植进去,我的框架是自己慢慢琢磨积累的,拿出来给大家分享一下。有不正确的地方。欢迎大家批评指正。谢谢。
首先,我们要搞client的框架,我们就须要考虑一下client要作的全部事情:
1、封装业务数据,用来向server发请求
2、连接server,发送网络请求
3、拿到响应结果,解析数据。给回到自己的界面进行逻辑推断。控制界面显示
4、依据数据控制自己的界面显示
以上四点是我所考虑的client须要作的事情。第四点我们就不说了,仅仅要拿到了数据 。界面控制,我们自己实现就能够了,这个时候。server的不论什么异常也影响不了我们,那我们的框架就是基于前三点考虑了。
结合这次我们公司server改动的过程说一下。应该更easy理解:
server之前的框架:仅仅有一个HP,client调用的时候,仅仅须要连接HPserver就能够了。封装业务数据格式例如以下
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMjI2NTc0NTk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
返回的json字符串格式例如以下图
就几个字段。很好解析
server之后的框架:ESB、ACC、HP。一下子多了两个,ESB是总体控制的,就是说你的全部业务调用的时候,不能再调用HP了,必须走ESB,ESB拿到数据后再进行纷发;ACC是账户中心业务。是从之前HP中分离出来的,也就是说之前业务中有属于账户中心的。如今的运行流程是先到ESB,ESB再纷发给ACC,ACC运行完后。把结果给ESB。ESB再将数据返回给client。并且ESB封装数据格式和ACC封装数据格式还不一样,ESB数据封装例如以下
ACC数据封装例如以下:
外边多加了一层,返回结果数据字段也不一样,这时候大家就明确client框架的重要性了!!
试想一下,假设我们的项目没有框架,回来的数据都是在Activity中处理,依据server返回的数据取结果,那server的依赖性特别大,假设server略微有点变动,那我们就死定了。每一个Activity都要改,工作量大如山啊,并且非常easy出错!Android本身强调高内聚,低偶合,这个道理也非常适用于我们client和server的交互,那我们如今要搭建的框架最应该考虑的。就是不受或者尽量少受server影响,不由于server变化而产生大的变化。所以,我自己总结出了我自己的client项目框架
当中Common类的大致方法例如以下:
/**
*
* @param context
* @param method调用的接口名称
* @param data
调用接口的业务数据
* @param urltype调用的url地址
* @param second调用接口的备用字段
* @return
*/
public static ResponseBean getHttpResult(RequestBean request){
ResponseBean response=new ResponseBean();
String result="";
HttpResponse httpResponse = returnResponse(request.urltype,request.data.toString());
try {
result = EntityUtils.toString(httpResponse.getEntity());
if (httpResponse != null
&& httpResponse.getStatusLine().getStatusCode() == 200) {
//serverutf-8编码,转换为本地GBK编码
if("0".equals(Constants.isEsb)){
result=new String(result.getBytes("iso-8859-1"),"utf-8");
}
} else {// 请求失败
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(TextUtils.isEmpty(result)){
response.code="-1";
response.msg="网络请求失败";
return response;
}else{
return parseResultToBean(result,request,response);
}
}
/**
* 解析http请求回来的结果
* @param resulthttp请求返回的字符串
* @param request请求的完整数据
* @param response封装好的响应信息
* @return
*/
private static ResponseBean parseResultToBean(String result,RequestBean request,ResponseBean response){
try{
JSONObject json=new JSONObject(result);
if("0".equals(request.packtype)){
response.code=json.getString("resp_code");
response.msg=json.getString("resp_desc");
response.data=(JSONObject) json.get("data");
if("1".equals(response.code)){
if(Constants.ACC_SYSTEM.equals(request.system)){
response.code=response.data.getString("resp_code");
response.msg=response.data.getString("resp_desc");
if(response.data.has("data")){
response.array=(JSONArray) response.data.get("data");
}
return response;
}else{
response.code=response.data.getString("errcode");
response.msg=response.data.getString("msg");
if(response.data.has("data")){
response.array=(JSONArray) response.data.get("data");
}
return response;
}
}else{
return response;
}
}else{
if(Constants.ACC_SYSTEM.equals(request.system)){
response.code=json.getString("resp_code");
response.msg=json.getString("resp_desc");
if(json.has("data")){
response.array=(JSONArray) json.get("data");
}
return response;
}else{
response.code=json.getString("errcode");
response.msg=json.getString("msg");
if(json.has("data")){
response.array=(JSONArray) json.get("data");
}
return response;
}
}
}catch(Exception e){
e.printStackTrace();
response.code="-2";
response.msg="解析结果失败";
return response;
}
}
/**
* 封装业务数据
* @param request
*
*/
public static void packRequestData(RequestBean request){
if(Constants.ACC_SYSTEM.equals(request.system)){
if("0".equals(request.packtype)){
request.data=packESBJsonData(request.context, request.data, request.method);
}else{
request.data=packCommonJson(request.data, request.context, request.method, request.system);
}
}else if(Constants.HP_SYSTEM.equals(request.system)){
request.data=packCommonJson(request.data, request.context, request.method, request.system);
if("0".equals(request.packtype)){
request.data=packESBJsonData(request.context, request.data, request.backupmethod);
}
}
}
我们能够看到,我仅仅须要构建RequestBean和ResponseBean就能够了。server的不论什么变化。我们仅仅须要在parseResultToBean(将结果解析为Bean)、packRequestData(封装请求数据)这两个方法中屏蔽完,我们要传回给Activity的解析结果,全部的字段都是我们自定义好的,简单解析例如以下:
private void cancleBind(final int type, final String openid) {
pDialog.show();
ThreadPool.getInstance().addTask(new Thread(){
public void run(){
try {
if (type == 1) {
QQInfo.logout(mTencent, BandAccountActivity.this);
}
JSONObject data = new JSONObject();
data.put("bindtype", type+"");
data.put("userid", Constants.userId);
RequestBean request=new RequestBean();
request.context=BandAccountActivity.this;
request.method="huicloud_remove_bind_sns";
request.backupmethod="";
request.packtype=Constants.isEsb;
request.data=data;
request.urltype=Constants.ACC_SYSTEM;
request.res="";
request.array=null;
request.system=Constants.ACC_SYSTEM;
Common.packRequestData(request);
ResponseBean response=Common.getHttpResult(request);
if("1".equals(response.code)){
handler.obtainMessage(4, type).sendToTarget();
}else{
handler.obtainMessage(5, type).sendToTarget();
}
Log.d(Constants.TAG, "===BandAccountActivity===取消绑定结果==="
+ response.toString() + "===请求数据===" + request.toString());
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
handler.obtainMessage(2,"网络错误").sendToTarget();
}
}
});
}
看到这里,大家基本大致明确我写这篇文章的目的了吧,再次强调一下,我们搭建自己client的框架,核心思想就是:产生client高内聚,减少与服务端的耦合性!!
!
而RequestBean和ResponseBean的各自属性,大家就能够依据自己的须要来定了,我眼下定的属性例如以下:
RequestBean:
/**
* 上下文环境
*/
public Context context;
/**
* 调用的接口名称
*/
public String method;
/**
* 调用接口的备用字段
* 由于调用呼朋系统且要经过ESB时。外层接口名称为upeng_app。内层才是真正的业务数据名称
* 当调用呼朋系统时。此字段不可缺少
*/
public String backupmethod;
/**
* 按什么样的要求封装数据
*/
public String packtype;
/**
* 调用接口的业务数据
*/
public JSONObject data;
/**
* 调用接口的url地址
*/
public String urltype;
/**
* 调用接口的备用字段
*/
public String res;
/**
* 备用的array类型
*/
public JSONArray array;
/**
* 调用哪个业务系统
*/
public String system;
ResponseBean的属性:
/**
* 请求结果码
*/
public String code;
/**
* 请求结果信息
*/
public String msg;
/**
* 按哪种方式解析结果
*/
public String packtype;
/**
* 结果数据
*/
public JSONObject data;
/**
* 备用的结果数据
*/
public JSONObject res;
/**
* 备用的存放多个对象
*/
public JSONArray array;
/**
* 结果为string时,用此字段
*/
public String result;
大家在解析结果时。仅仅须要在Common类的parseResultToBean方法中。依据server变化后的方式,任意加入自己解析结果的方式就能够了,自己的这个小框架也经过了一些项目的锻炼,自己感觉很好用。推荐给大家,假设大家有好的提议。欢迎交流,我的QQ:1531074759,自己的框架理解就说到这里,谢谢大家!
浅谈Androidclient项目框架的更多相关文章
- 浅谈JAVA集合框架
浅谈JAVA集合框架 Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection cl ...
- 浅谈开源项目Android-Universal-Image-Loader(Part 3.1)
本文转载于:http://www.cnblogs.com/osmondy/p/3266023.html 浅谈开源项目Android-Universal-Image-Loader(Part 3.1) 最 ...
- [转]浅谈Python web框架
说到web framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界,各种micro-framework.framework不可胜数,不完全列表见:http://wi ...
- 浅谈Python web框架
一.Python web框架 Web Framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界,各种micro-framework.framework不可胜数,不完全 ...
- Vue 浅谈前端js框架vue
Vue Vue近几年来特别的受关注,三年前的时候angularJS霸占前端JS框架市场很长时间,接着react框架横空出世,因为它有一个特性是虚拟DOM,从性能上碾轧angularJS,这个时候,vu ...
- 浅谈 Angular 项目实战
为什么使用 Angular 我不是 Angular 的布道者,但如今痴迷 Angular,使用 Angular 做项目让我有一种兴奋感.目前的三大主流前端框架都研究过,博客中也有三者的相关教程,最早接 ...
- 浅谈Log4j2日志框架及使用
目录 1.日志框架 2.为什么需要日志接口,直接使用具体的实现不就行了吗? 3.log4j2日志级别 4.log4j2配置文件的优先级 5.对于log4j2配置文件的理解 6.对于Appender的理 ...
- 浅谈前端三大框架Angular、react、vue
每个框架都不可避免会有自己的一些特点,从而会对使用者有一定的要求,这些要求就是主张,主张有强有弱,它的强势程度会影响在业务开发中的使用方式. 一.Angular,它两个版本都是强主张的,如果你用它,必 ...
- 浅谈python web框架django2.x
1.Django简介 Python下有多款不同的 Web 框架,Django是最有代表性的一种.许多成功的网站和APP都基于Django. Django是一个开源的Web应用框架,由Python写成. ...
随机推荐
- sql server 数据库的操作
Technorati 标记: sql截取,sql修改 把一个字段的部分取出来,插入到新字段 1 ) //方法二 sql server修改一个字段中的部分数据 update tablename se ...
- [转]Struts标签库详解
本文转自:http://hi.baidu.com/xzkcz/blog/item/5cf9f91f01beb9f4e0fe0bd4.html Struts提供了五个标签库,即:HTML.Bean. ...
- Ubuntu 16.04 Mxnet CPU 版本安装
在安装前配置好更新源,基本要求就是速度越快越好: 1.安装Python apt-get install python 2.安装Git apt-get install git 3.安装依赖包 ...
- 程序语言的奥妙:算法解读 ——读书笔记
算法(Algorithm) 是利用计算机解决问题的处理步骤. 算法是古老的智慧.如<孙子兵法>,是打胜仗的算法. 算法是古老智慧的结晶,是程序的范本. 学习算法才能编写出高质量的程序. 懂 ...
- 记一个社交APP的开发过程——基础架构选型(转自一位大哥)
记一个社交APP的开发过程——基础架构选型 目录[-] 基本产品形态 技术选型 最近两周在忙于开发一个社交App,因为之前做过一点儿社交方面的东西,就被拉去做API后端了,一个人头一次完整的去搭这么一 ...
- 【Python学习笔记】字典操作
字典dict是Python中唯一内置的映射类型,由键值对组成,字典是无序的.字典的键必须是不变对象,如字符串.数字.元组等,而包含可变对象的列表.字典和元组则不能作为键.这里可变和不可变的意思是指这个 ...
- MySQL/MariaDB/Percona数据库升级脚本
MySQL/MariaDB/Percona数据库升级脚本截取<OneinStack>中upgrade_db.sh, 一般情况下不建议升级数据库版本,该脚本专提供给各位版本控们.为防止大版本 ...
- 简单版问卷调查系统(Asp.Net+SqlServer2008)
1.系统主要涉及以下几个表 问卷项目表(Q_Naire) 问卷题目表(Q_Problem) 题目类型表(Q_ProblmeType) 题目选项表(Q_Options) 调查结果表(Q_Answer) ...
- java线性表学习笔记(二)
链表中的每一个元素都包含一个称为节点的结构,每向链表中增加一个元素,就会产生一个与之相关的节点,每个节点与它相邻的节点相连接(这是基础吧,不过在看c的时候没认真看,呼). 定义节点类如下(使用了泛型, ...
- UVa11235 FrequentValues(RMQ)
Problem F: Frequent values You are given a sequence of n integers a1 , a2 , ... , an in non-decreasi ...