上门洗车APP --- Androidclient开发 之 网络框架封装介绍(二)

前几篇博文中给大家介绍了一下APP中的基本业务及开发本项目使用的网络架构:

上门洗车APP --- Androidclient开发 前言及业务简单介绍

上门洗车APP --- Androidclient开发 之 网络框架封装介绍(一)

本篇接着给大家分享网络框架封装。相信感兴趣的朋友已经对上篇博文中的一些开源项目有了些许了解。这里继续为大家介绍关于GenericDataManager 通用网络管理类中的 dataRequest 方法 和 请求參数封装类 RequestParameterFactory

在上篇博文中我们有介绍 dataRequest 中传入了一些參数,且使用了泛型<T>,以下就给大家介绍传入的详细參数:

/**
* 该方法封装了网络数据请求和数据解析
* 并传入回调接口
* @param requestId 请求ID
* @param requestType 请求类型(此处依据传入的常量仅仅提供了get请求和post请求)
* @param urlString 请求URL
* @param mParams 请求參数
* @param parser 通用数据解析抽象解析器
* @param mCallback 自己定义接口回调
*/
public <T> void dataRequest(final int requestId,String requestType,String urlString,RequestParams mParams,
final AbstractParser<T> mParser,final IRequestCallback mCallback)

这里主要给大家说明两个參数,即 final AbstractParser<T>  mParser  和  final IRequestCallback  mCallback ,关于IRequestCallback 上篇已经介绍过。该类是定义的回调接口。该接口中的方法定义目的就是为了让Activity实现做数据回调处理。

AbstractParser<T> 是个什么玩意呢 ?

这里先说一下项目中server传递过来的 JSON 数据格式,本着规范易读,维护性好,管理方便的原则,我们统一了JSON格式,例如以下图一、图二中的介绍:

图 一

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ2FvX2NodW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

图 二

也就是说数据格式中的 message、status、data 三个字段是固定的。message为String类型。status为int类型,而data呢。有可能是jsonObject或者jsonArray,故每从server端发出一条请求,若请求成功,则返回格式都如上图二所看到的,数据在data中。

所以此处我们定义一个model,即Result<T>类,来看下:

/**
* @author gao_chun
*
*/
public class Result<T> { private int status;//server返回状态码
private String message;//message
private T data;//返回数据 /**
* @return the status
*/
public int getStatus() { return status;
} /**
* @param status the status to set
*/
public void setStatus(int status) { this.status = status;
} /**
* @return the message
*/
public String getMessage() { return message;
} /**
* @param message the message to set
*/
public void setMessage(String message) { this.message = message;
} /**
* @return the data
*/
public T getData() { return data;
} /**
* @param data the data to set
*/
public void setData(T data) { this.data = data;
} public boolean isOK() {
return status >= 2000 && status < 3000;
}
}

注:<T>。即泛型(Generic Types)。JDK1.5新特性,使用时能够理解为创建一个用类型作为參数的类或方法。也能够这样理解,就是说,若一个类或方法里面要用到另外一个类,但我又不确定所须要用到的那个类的详细类型,所以就用到了Generic Types,这里简单说明,就只是多解释了,朋友若不明确能够去查阅相关文档。

定义了一个model类,我们还再去定义一个解析器接口,即 IParser<T> ,该接口也使用泛型:

package org.gaochun.parser;

/**
* @author gao_chun
*
*/
public interface IParser<T> { public T parse(String data); }

那么以下我们再来看这个 AbstractParser<T> 类。这个类是我们定义的一个抽象解析类,且实现了解析器接口,须要注意的是我们定义的解析器 IParser<T> 使用了泛型,model类 Result<T> 也是如此,再次来看详细的 AbstractParser<T> :

import org.gaochun.model.Result;
import org.gaochun.utils.JsonUtils;
import org.json.JSONArray;
import org.json.JSONObject; /**
* 抽象解析类
* 目的:解析server端外层数据,并供详细解析类继承重写解析方法
* @author gao_chun
*/
public abstract class AbstractParser<T> implements IParser<Result<T>> { @Override
public final Result<T> parse(String response) { final Result<T> result = new Result<T>(); //创建Result类对象 if (response != null && response.length() > 0) { final JSONObject jsonObject = JsonUtils.createJsonObject(response); //将response的数据创建为JsonObject if (jsonObject != null) {
//获得status、message、data数据
result.setStatus(JsonUtils.getStringInt(jsonObject, "status"));
result.setMessage(JsonUtils.getString(jsonObject, "message"));
final Object object = JsonUtils.getObject(jsonObject, "data");
//实现data进一步解析。泛型
if (object != null && (object instanceof JSONObject || object instanceof JSONArray)) {
T data = parseData(object); //解析
result.setData(data); //设置数据
} else {
result.setData(null);
}
} else {
result.setStatus(Result.STATUS_JSON_ERROR);
} } else {
result.setStatus(Result.STATUS_RESPONSE_NULL_OR_EMPTY);
}
return result;
} //抽象解析方法,目的是为了让详细的解析类重写
protected abstract T parseData(Object object); }

或许朋友就恍然大悟了,沃尼玛。原来是酱紫的啊。

我们回过头来看看登录请求:

private void login(String name,String pwd){  

        GenericDataManager mDataManager = GenericDataManager.getInstance();//通用网络管理类  

        RequestParams mParams = RequestParameterFactory.getInstance().login(name, pwd);//请求參数管理类  

        mDataManager.dataRequest(0,Constants.REQUEST.GET, RequestURL.URL_LOGIN, mParams,new ResultParser(), this);//运行网络请求
}

在 dataRequest 中传入了 new ResultParser() 解析对象:

public class ResultParser extends AbstractParser<Object> {

    /* (non-Javadoc)
* @see app.backend.network.AbstractParser#parseData(java.lang.Object)
*/
@Override
public Object parseData(Object object) {
return object;
}

这里要说明。若server端 data 中无返回数据。也就是说发出请求,若仅仅须要告诉我 success 或者 failed,那就直接传入new ResultParser() 解析器对象便可,在Activity的回调中,取出相应状态推断就可以:

data 中存在返回数据须要解析。那么此时须要创建解析器,给个样例:

//继承AbstractParser<T> 并在泛型中传入解析后的结果(集合或对象)
public class WasherParser extends AbstractParser<List<NearbyWasher>> { @Override
public List<NearbyWasher> parseData(Object object) { if (object != null) {
return JSON.parseArray(object.toString(), NearbyWasher.class);
}
return null;
}
}

JSON.parseArray() 方法是使用了阿里巴巴的fastJson。此处大家也能够使用Gson,或者使用Android自带Json工具解析。

关于fastJson的使用,本人之前也总结了一篇博文可供大家參考。

Android开发之怎样使用FastJson:http://blog.csdn.net/gao_chun/article/details/39232097

继续给大家介绍 RequestParameterFactory ,该类的定义是封装了參数请求,如:

可能有朋友会说,直接写在  private void login(String name,String pwd)  方法中不就能够了,何必再创建一个类呢?

个人认为。这样定义出一个类的话,有便于管理,若需求改变,添加了某个字段,不须要到处在Activity中寻找,且项目层次结构清晰。个人愚见。

这里还须要给大家介绍一个类 GlobalConfigManager,该类为本地配置管理。主要作用是读取serverip地址,比方我们的登录接口是:http://192.168.1.1:8080/WashCar/washer/login?name=yang&pwd=123。我们将前缀http://192.168.1.1:8080 写在AndroidManifest.xml文件的meta-data中,使用时在MainApplication中提前初始化:

    <application
android:name="org.gaochun.ui.MainApplication"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.White.NoTitleBar" > <activity
android:name="org.gaochun.activity.LoginActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> <!--serverIP-->
<meta-data
android:name="app.server"
android:value="http://192.168.1.1:8080" />
</application>

整个网络通讯架构大概就是这么回事了。整理了一下源代码。给大家共享学习。

下篇博文打算给大家介绍res文件夹下界面开发中需注意的地方并共享源代码,感谢大家的关注,共同学习。

源代码下载:http://download.csdn.net/download/gao_chun/8843515

上门洗车APP --- Androidclient开发 之 项目结构介绍

【注:转载注明gao_chun的BLOG http://blog.csdn.net/gao_chun/article/details/46655411

上门洗车APP --- Androidclient开发 之 网络框架封装介绍(二)的更多相关文章

  1. 家庭洗车APP --- Androidclient开展 之 网络框架包介绍(一)

    家庭洗车APP --- Android客户端开发 之 网络框架包介绍(一) 上篇文章中给大家简单介绍了一些业务.上门洗车APP --- Android客户端开发 前言及业务简单介绍,本篇文章给大家介绍 ...

  2. 上门洗车APP --- Androidclient开发 之 项目结构介绍

    上门洗车APP --- Androidclient开发 之 项目结构介绍 前言 尽管公司项目较紧,但还是抽空给大家继续更新. o_O"~ 欢迎大家的关注,非常高兴和大家共同学习.前面给大家分 ...

  3. 上门洗车App 竟然是块大肥肉!

    http://www.leiphone.com/k-xiche-app-idea.html 打车App.租车App.防违规App我们见得多,但洗车App你一定没听过,之前在一次创业路演上碰到一个做上门 ...

  4. android 开发 - 使用okhttp框架封装的开发框架

    概述 在android开发中经常要访问网络,目前最流行的网络访问框架就是Okhttp了,然而我们在具体使用时,往往仍然需要二次封装.我使用Builder设计模式进行了封装形成oknet开源库. 介绍 ...

  5. Android应用开发:网络工具——Volley(二)

    引言 在Android应用开发:网络工具--Volley(一)中结合Cloudant服务介绍了Volley的一般使用方法.当中包括了两种请求类型StringRequest和JsonObjectRequ ...

  6. 第209天:jQuery运动框架封装(二)

    运动框架 一.函数------单物体运动框架封装 1.基于时间的运动原理 动画时间进程 动画距离进程 图解: 物体从0移动到400 当物体移动到200的时候 走了50% 同样的,物体总共运行需要4秒 ...

  7. 【iOS开发】Alamofire框架的使用二 高级用法

    Alamofire是在URLSession和URL加载系统的基础上写的.所以,为了更好地学习这个框架,建议先熟悉下列几个底层网络协议栈: URL Loading System Programming ...

  8. iOS开发之网络数据解析(二)--XML解析简介

    前言:本篇随笔介绍的是XML解析. 正文: 1.XML解析方式有2两种: DOM:一次性将整个XML数据加载进内存进行解析,比较适合解析小文件 SAX:从根元素开始,按顺序一个元素一个元素往下解析,比 ...

  9. openresty 前端开发轻量级MVC框架封装一(控制器篇)

    通过前面几章,我们已经掌握了一些基本的开发知识,但是代码结构比较简单,缺乏统一的标准,模块化,也缺乏统一的异常处理,这一章我们主要来学习如何封装一个轻量级的MVC框架,规范以及简化开发,并且提供类似p ...

随机推荐

  1. IDEA 注册问题,创建 和 删除项目

    目录 .....2016.3/2017.1 IDEA 注册码 .....IDEA 创建项目 .....IDEA 删除项目 IDEA 注册码 复制使用别人的注册码,启动选择如下: 复制粘贴如下代码: 这 ...

  2. 【POJ1067】取石子游戏(威佐夫博弈)

    题意:有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子. 游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子. 最后把石子全部取完 ...

  3. C语言中的基础知识变量探讨

    C语言中的变量是编程的基础,主要有四个要素:存储类型.存储大小.存储名称和存储地址. 一.变量的要素: 1.存储类型:主要表明名变量存储的特征,主要有auto.extern.static和regist ...

  4. VIM 的 modeline 和 autocmd

    modeline vim的modeline可以让你针对每个文件进行文件级别的设置,这些设置是覆盖当前用户的vimrc中的设置的.当vim打开一个包含了vim modeline注释行的文件时,会自动读取 ...

  5. linux 实现共享内存同步

    本文主要对实现共享内存同步的四种方法进行了介绍. 共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝.它是IPC对象的一种. 为了在多个进程间交换信息,内核专门留出了 ...

  6. 《30天学习30种新技术》-Day 15:Meteor —— 从零开始创建一个 Web 应用

    目录:https://segmentfault.com/a/1190000000349384 原文: https://segmentfault.com/a/1190000000361440 到目前为止 ...

  7. c#反射,委托,事件

    1.反射,通过类名来实例化类 //用构造函数动态生成对象: Type t = typeof(NewClassw); Type[] pt = ]; pt[] = typeof(string); pt[] ...

  8. CF501D Misha and Permutations Summation(康托展开)

    将一个排列映射到一个数的方法就叫做康托展开.它的具体做法是这样的,对于一个给定的排列{ai}(i=1,2,3...n),对于每个ai求有多少个aj,使得j>i且ai>aj,简单来说就是求a ...

  9. 洛谷——P1690 贪婪的Copy

    P1690 贪婪的Copy 题目描述 Copy从卢牛那里听说在一片叫yz的神的领域埋藏着不少宝藏,于是Copy来到了这个被划分为个区域的神地.卢牛告诉了Copy这里共有个宝藏,分别放在第Pi个(1&l ...

  10. 使用OPENROWSET爆破SQL Server密码

    使用OPENROWSET爆破SQL Server密码   OPENROWSET函数是SQL Server提供的一个连接函数.它可以用于使用OLE DB方式连接一个数据库,并进行数据查询等操作.使用该函 ...