在刚刚开始做http模块的时候,没有用开源网络库,仅仅简单的封装了系统的HttpClient,所以在解析json数据的时候做了一定的封装处理,可以统一处理json解析减少代码重复,用到了简单的泛型处理,以下是处理思路:
我们发起网络请求的时候,预先传入携带泛型的回调监听,用来为统一解析提供处理类型,类似以下方式
//DoHttpRequest 是封装的http工具,只关注这个模式即可,忽略即可
DoHttpRequest doHttpRequest = new DoHttpRequest(DoHttpRequest.GET,
Constant.FLOWPROC_GET, postData, null,
new ResultCallbackListener<List<WorkFlowProcDetail>>() {
@Override
public void onResult(List<WorkFlowProcDetail> list) {
//数据处理
}
@Override
public void onFail(){
//失败处理
}
@Override
public void onEnd() {
//结束处理
}
});
new Thread(doHttpRequest).start();
以下为具体的监听处理代码
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
@SuppressWarnings({ "unchecked" })
public abstract class JsonParseCallbackListener<T> {
protected T data;
protected Type entityType;
/**
* 取得子类class的方法
*/
public JsonParseCallbackListener() {
Type genType = getClass().getGenericSuperclass();
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
entityType = params[0];
}
public void parse(String json) {
if (entityType.equals(String.class)) {
onResult((T) json);
} else {
data = JsonHelper.parseObject(json, entityType);
if (data == null) {
onFail();
} else {
onResult(data);
}
}
onEnd();
}
public abstract void onResult(T result);
public abstract void onFail();
public abstract void onEnd();
}
public abstract class ResultCallbackListener<T> extends
JsonParseCallbackListener<T> {
public static final int SUCCESS = 0x001;
public static final int FAIL = 0x002;
public void onHandle(int status, String result) {
switch (status) {
case SUCCESS:
parse(result);
break;
case FAIL:
onFail();
onEnd();
break;
}
}
}
以下为取得json数据的分发处理
//http请求成功时
listener.onHandle(ResultCallbackListener.SUCCESS,jsonStr);
//http请求失败时
listener.onHandle(ResultCallbackListener.FAIL, null);
这样即可统一处理数据解析,处理的重点在或者获取泛型的数据类型上,谨此记录,方便自己翻阅