浅谈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" >

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

时间: 2024-10-10 08:31:58

浅谈Androidclient项目框架的相关文章

浅谈 WPF 项目框架搭建

在WPF项目开发中最常用的开发模式无疑是MVVM模式,  MVVM模式开发的好处,在这里就不详细讨论, 还有 本文中所使用MVVMLight框架,为什么使用MVVM框架(1.框架较轻,2.学习成本低.3.适用大多数中小型项目,4.相对于微软的prism框架更容易上手)    下面开始 一步一步 搭建框架 第一步: 利用反射创建VM构造器 public class ViewModelFactory { private static Dictionary<string, object> vmMap

浅谈软件项目的需求管理

软件项目区别于其它项目的最显著的特征是其不可见性,它不像硬件购销.建筑工程,都是实实在在可见的东西.而软件项目在系统交付之前很长一段时间,客户是无法感知自己想要的系统究竟是什么样子.因此,需求管理就显得十分重要,据相关统计数据分析,软件项目90%以上失败的原因都在于没有重视需求或者需求管理方面做的不到位导致的. 需求管理作为软件项目管理的一个重要内容,贯穿项目实施的全生命周期.俗话说:万事开头难.需求作为软件开发的第一个环节,其重要性不言而喻.市面上关于需求管理的相关理论和书籍很多,但多数停留在

浅谈Python web框架

一.Python web框架 Web Framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界,各种micro-framework.framework不可胜数,不完全列表见: 官网相关的链接:http://wiki.python.org/moin/WebFrameworks 虽然另一大脚本语言PHP也有不少框架,但远没有Python这么夸张,也正是因为Python Web Framework(Python Web开发框架,以下简称Python框架)太多,所以在P

浅谈Vue项目优化

前几天看到大家说 vue 项目越大越难优化,带来很多痛苦,这是避免不了的,问题终究要解决,框架的性能是没有问题的,各大测试网站都有相关数据.下面进入正题 转自https://blog.csdn.net/qq_33834489/article/details/79144762 基础优化 所谓的基础优化是任何 web 项目都要做的,并且是问题的根源.HTML,CSS,JS 是第一步要优化的点 分别对应到 .vue 文件内的,<template>,<style>,<script&g

java语言有哪些优势?浅谈java三大框架

对于初学者来说,这三大框架Struts+Hibernate+Spring被赋予了太多神秘的色彩,似乎它们是重中之重的知识!但是对于拥有多年java开发经验的专业技术人员来说,对于那些Java牛人来说,却对这三大框架不太感冒!那么这三大框架到底重不重要呢? 现在很多企业都在用这三大框架,所以面试时面试官总会问三大框架的问题.但不可否认的是,也有很多大型企业没有用这三大框架,这些企业经过多年发展,自身已经有一定的技术积累,也形成了自己独特的技术框架体系.对于这些企业来说这三大框架既可以说很重要,也可

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

每个框架都不可避免会有自己的一些特点,从而会对使用者有一定的要求,这些要求就是主张,主张有强有弱,它的强势程度会影响在业务开发中的使用方式.一.Angular,它两个版本都是强主张的,如果你用它,必须接受以下东西: - 必须使用它的模块机制- 必须使用它的依赖注入- 必须使用它的特殊形式定义组件(这一点每个视图框架都有,难以避免) 所以Angular是带有比较强的排它性的,如果你的应用不是从头开始,而是要不断考虑是否跟其他东西集成,这些主张会带来一些困扰. 二.React,它也有一定程度的主张,

浅谈javaweb三大框架和MVC设计模式

一.MVC设计模式 1.MVC的概念 首先我们需要知道MVC模式并不是javaweb项目中独有的,MVC是一种软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller),即为MVC.它是一种软件设计的典范,最早为Trygve Reenskaug提出,为施乐帕罗奥多研究中心(Xerox PARC)的Smalltalk语言发明的一种软件设计模式. 2.MVC的详解 虽然MVC并不是Java当中独有的,但是现在几乎所有的B/S的架构都

Vue 浅谈前端js框架vue

Vue Vue近几年来特别的受关注,三年前的时候angularJS霸占前端JS框架市场很长时间,接着react框架横空出世,因为它有一个特性是虚拟DOM,从性能上碾轧angularJS,这个时候,vue1.0悄悄 的问世了,它的优雅,轻便也吸引了一部分用户,开始收到关注,16年中旬,VUE2.0问世,这个时候vue不管从性能上,还是从成本上都隐隐超过了react,火的一塌糊涂,这个时候,angular 开发团队也开发了angular2.0版本,并且更名为angular,吸收了react.vue的

浅谈Python Django框架

1.Django简介 Python下有多款不同的 Web 框架,Django是最有代表性的一种.许多成功的网站和APP都基于Django. Django是一个开源的Web应用框架,由Python写成. Django采用了MVC的软件设计模式,即模型M,视图V和控制器C.   2.Django的特点 1) 强大的数据库功能:用python的类继承,几行代码就可以拥有一个动态的数据库操作API,如果需要也能执行SQL语句. 2) 自带的强大的后台功能:几行代码就让网站拥有一个强大的后台,轻松管理内容