写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项目框架的更多相关文章

  1. 浅谈JAVA集合框架

    浅谈JAVA集合框架 Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection cl ...

  2. 浅谈开源项目Android-Universal-Image-Loader(Part 3.1)

    本文转载于:http://www.cnblogs.com/osmondy/p/3266023.html 浅谈开源项目Android-Universal-Image-Loader(Part 3.1) 最 ...

  3. [转]浅谈Python web框架

    说到web framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界,各种micro-framework.framework不可胜数,不完全列表见:http://wi ...

  4. 浅谈Python web框架

    一.Python web框架 Web Framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界,各种micro-framework.framework不可胜数,不完全 ...

  5. Vue 浅谈前端js框架vue

    Vue Vue近几年来特别的受关注,三年前的时候angularJS霸占前端JS框架市场很长时间,接着react框架横空出世,因为它有一个特性是虚拟DOM,从性能上碾轧angularJS,这个时候,vu ...

  6. 浅谈 Angular 项目实战

    为什么使用 Angular 我不是 Angular 的布道者,但如今痴迷 Angular,使用 Angular 做项目让我有一种兴奋感.目前的三大主流前端框架都研究过,博客中也有三者的相关教程,最早接 ...

  7. 浅谈Log4j2日志框架及使用

    目录 1.日志框架 2.为什么需要日志接口,直接使用具体的实现不就行了吗? 3.log4j2日志级别 4.log4j2配置文件的优先级 5.对于log4j2配置文件的理解 6.对于Appender的理 ...

  8. 浅谈前端三大框架Angular、react、vue

    每个框架都不可避免会有自己的一些特点,从而会对使用者有一定的要求,这些要求就是主张,主张有强有弱,它的强势程度会影响在业务开发中的使用方式. 一.Angular,它两个版本都是强主张的,如果你用它,必 ...

  9. 浅谈python web框架django2.x

    1.Django简介 Python下有多款不同的 Web 框架,Django是最有代表性的一种.许多成功的网站和APP都基于Django. Django是一个开源的Web应用框架,由Python写成. ...

随机推荐

  1. Canvas 2D绘制抗锯齿的1px线条

    当绘制1像素的线条时,发现多条线明显存在着粗细不均的问题,线条带有明显的锯齿. 事实上,Canvas的绘制线条指令都存在这个状况,如lineTo,arcTo,strokeRect. 解决方案是将Can ...

  2. 精选PSD素材下载周刊【Goodfav PSD 20130720】

    我们每周精选来自Goodfav PSD的免费PSD素材,有兴趣的朋友尤其是做设计工作的,不妨收藏或者下载. 这些现成的PSD素材能给我们一些相关的灵感,从而提高工作的效率. 1.File Upload ...

  3. 神奇的linux发行版 tiny core linux

    首先官网在此 http://tinycorelinux.net/ 真正轻量级 名字里带有“tiny”又带有“core”,想必又是一个所谓的“轻量级”发行版. 轻量级我们见多了,debian号称是轻量级 ...

  4. 使用gdb调试多线程程序总结

    转:使用gdb调试多线程程序总结 一直对GDB多线程调试接触不多,最近因为工作有了一些接触,简单作点记录吧. 先介绍一下GDB多线程调试的基本命令. info threads 显示当前可调试的所有线程 ...

  5. URAL-1998 The old Padawan 二分

    题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1998 题意:有n个石头,每个石头有个重量,每个时间点你能让一个石头飞起来,但有m个时间点 ...

  6. create_project.py报错问题,建议用回python2.7

    d:\DevTool\cocos2d-x-2.2.2\cocos2d-x-2.2.2\tools\project-creator\create_project.py 报错 d:\DevTool\coc ...

  7. android 开发必用的开源库

    LogReport:  https://github.com/wenmingvs/LogReport,   崩溃日志上传框架 wcl-permission-demo:Android 6.0 - 动态权 ...

  8. cocos2d-x 2.2.5 安卓工程编译的问题

    原址:http://www.cocoachina.com/bbs/read.php?tid=217124 新的cocos2d-x 2.2.5 在使用Eclipse的安卓NDK 9 的编译器进行编译的时 ...

  9. Type Encoding

    [Type Encodings] The compiler encodes the return and argument types for each method in a character s ...

  10. 闲置的eSATA接口,会影响Windows 7的启动速度

      为方便用户连接外置硬盘等设备,很多中高 端主板上都有至少一个eSATA接口.事实上,很多人可能根本就不用eSATA接口,你想过没有,正是这个无所事事的eSATA接口,可能无意中就拖慢了 你的Win ...