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

男儿欲遂平生志,六经勤向窗前读。这篇文章主要讲述上门洗车APP --- Androidclient开发 之 网络框架封装介绍相关的知识,希望能为你提供帮助。
上门洗车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格式,例如以下图一、图二中的介绍:

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

文章图片

图 一




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



图 二

也就是说数据格式中的 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 = https://www.songbingjia.com/android/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的数据创建为JsonObjectif (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 = https://www.songbingjia.com/android/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的回调中,取出相应状态推断就可以:
上门洗车APP --- Androidclient开发 之 网络框架封装介绍

文章图片




若 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 ,该类的定义是封装了參数请求,如:
上门洗车APP --- Androidclient开发 之 网络框架封装介绍

文章图片


可能有朋友会说,直接写在   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=https://www.songbingjia.com/android/" http://192.168.1.1:8080" /> < /application>


整个网络通讯架构大概就是这么回事了。整理了一下源代码。给大家共享学习。
下篇博文打算给大家介绍res文件夹下界面开发中需注意的地方并共享源代码,感谢大家的关注,共同学习。


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




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



【上门洗车APP --- Androidclient开发 之 网络框架封装介绍】

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


    推荐阅读