浅谈Androidclient项目框架

it2025-10-31  18

写Android也有些时间了,一边工作,一边学习,一边积累。仅仅有遇到问题了,花时间去研究,自己的能力才干提升。刀假设不用。慢慢的就会生锈应该也是这个道理吧!上个月公司项目server框架进行的一些调整。可是当时自己的项目没有移植框架。还是前人的代码,一下子差点没把我搞死,真是筋疲力尽。一个周末两天所有加班赶,结果赶出来的质量还很差,等改完了之后大概稳定下来。自己赶紧抽闲余时间把自己的框架移植进去,我的框架是自己慢慢琢磨积累的,拿出来给大家分享一下。有不正确的地方。欢迎大家批评指正。谢谢。

首先,我们要搞client的框架,我们就须要考虑一下client要作的全部事情:

1、封装业务数据,用来向server发请求

2、连接server,发送网络请求

3、拿到响应结果,解析数据。给回到自己的界面进行逻辑推断。控制界面显示

4、依据数据控制自己的界面显示

以上四点是我所考虑的client须要作的事情。第四点我们就不说了,仅仅要拿到了数据 。界面控制,我们自己实现就能够了,这个时候。server的不论什么异常也影响不了我们,那我们的框架就是基于前三点考虑了。

结合这次我们公司server改动的过程说一下。应该更easy理解:

server之前的框架:仅仅有一个HP,client调用的时候,仅仅须要连接HPserver就能够了。封装业务数据格式例如以下

返回的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 blocke.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 exceptione.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,自己的框架理解就说到这里,谢谢大家!

转载于:https://www.cnblogs.com/bhlsheji/p/5369310.html

最新回复(0)