标签:android项目开发 框架 管理 开源项目
上门洗车APP --- Android客户端开发 前言及业务简介
上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一)
本篇接着给大家分享网络框架封装,相信感兴趣的朋友已经对上篇博文中的一些开源项目有了些许了解,这里继续为大家介绍关于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)那 AbstractParser<T> 是个什么玩意呢 ?
这里先说一下项目中服务器传递过来的 JSON 数据格式,本着规范易读,维护性好,管理方便的原则,我们统一了JSON格式,如下图一、图二中的介绍:
图 一
所以此处我们定义一个model,即Result<T>类,来看下:
/**
* @author gao_chun
*
*/
public class Result<T> {
private int status;//服务器返回状态码
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;
}
}定义了一个model类,我们还再去定义一个解析器接口,即 IParser<T> ,该接口也使用泛型:
package org.gaochun.parser;
/**
* @author gao_chun
*
*/
public interface IParser<T> {
public T parse(String data);
}import org.gaochun.model.Result;
import org.gaochun.utils.JsonUtils;
import org.json.JSONArray;
import org.json.JSONObject;
/**
* 抽象解析类
* 目的:解析服务器端外层数据,并供具体解析类继承重写解析方法
* @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);//执行网络请求
}
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;
}这里要说明,若服务器端 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,该类为本地配置管理,主要作用是读取服务器ip地址,比如我们的登录接口是: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>
<!--服务器IP-->
<meta-data
android:name="app.server"
android:value="http://192.168.1.1:8080" />
</application>源码下载:http://download.csdn.net/download/gao_chun/8843515
@remark: 本系列Blog禁止转载
版权声明:本文为博主原创文章,未经博主允许不得转载。
上门洗车APP --- Android客户端开发 之 网络框架封装(二)
标签:android项目开发 框架 管理 开源项目
原文地址:http://blog.csdn.net/gao_chun/article/details/46655411