本文是對volley返回數據進行封裝,有3種封裝,返回格式分別是:JSON、bean類、List< bean >
下文解析數據使用的是fastjson包,
對於volley請求封裝請看:
http://blog.csdn.net/qq_24827089/article/details/54729850
對CallBack進行改寫成接口ICallBack:
public interface ICallBack<T> {
void parseData(String data);
void onSuccess(T t);
void onFail(int code, String errMSg);
void onCancel();
boolean canCancel();
}
JSON封裝:
public class JSONCallBack implements ICallBack<JSONObject> {
@Override
public void parseData(String data) {
try {
JSONObject object = JSON.parseObject(data);
int code = object.getIntValue("code");
if (code == 0) {
onSuccess(object);
} else {
onFail(code,object.getString("errmsg"));
}
} catch (JSONException e) {
onFail(-1,"讀取服務器數據失敗");
}
}
@Override
public void onSuccess(JSONObject object) {
}
@Override
public void onFail( int code, String errMSg) {
}
@Override
public void onCancel() {
}
@Override
public boolean canCancel() {
return true;
}
}
bean類封裝:
解析bean的基類,每個請求數據都會返回的code,根據code進行一些處理,如登錄失效、參數錯誤等:
基類:
public class CallBackBean {
private int code;
private String errMsg = "";
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getErrMsg() {
return errMsg;
}
public void setErrMsg(String errMsg) {
this.errMsg = errMsg;
}
}
實現ICallBack:
public class BeanCallBack<T extends CallBackBean> implements ICallBack<T>{
@Override
public void parseData(String data) {
try{
Class<T> entityClass = null;
Type t = getClass().getGenericSuperclass();
if(t instanceof ParameterizedType){
Type[] p = ((ParameterizedType)t).getActualTypeArguments();
entityClass = (Class<T>)p[0];
}
T bean = JSON.parseObject(data,entityClass);
if (bean.getCode() == 0) {
onSuccess(bean);
} else {
onFail(bean.getCode(),bean.getErrMsg());
}
} catch (Exception e){
onFail(-1,"讀取服務器數據失敗");
}
}
@Override
public void onSuccess(T t) {
}
@Override
public void onFail(int code, String errMSg) {
}
@Override
public void onCancel() {
}
@Override
public boolean canCancel() {
return true;
}
}
List< bean >類封裝:
服務器返回數據如{“code”:”1”,”list”:[],”a”:”1234”},我們只要list的列表而已,下面實現直接返回list
創建註解,標註列表的key:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ListName {
String value();
}
實現類:
public class ListCallBack<T extends Object> implements ICallBack<List<T>>{
@Override
public void parseData(String data) {
try{
JSONObject object = JSON.parseObject(data);
int code = object.getIntValue("code");
if (code == 0) {
Class<T> entityClass = null;
Type t = getClass().getGenericSuperclass();
if(t instanceof ParameterizedType){
Type[] p = ((ParameterizedType)t).getActualTypeArguments();
entityClass = (Class<T>)p[0];
}
String listKey = entityClass.getSimpleName();
ListName annotation = entityClass.getAnnotation(ListName.class);
if (annotation!=null)
listKey = annotation.value();
onSuccess(JSON.parseArray(object.getString(listKey),entityClass));
} else {
onFail(code,object.getString("errMsg"));
}
} catch (Exception e){
onFail(-1,"讀取服務器數據失敗");
}
}
@Override
public void onSuccess(List<T> ts) {
}
@Override
public void onFail(int code, String errMSg) {
}
@Override
public void onCancel() {
}
@Override
public boolean canCancel() {
return true;
}
}
volley的單例請求只需要改數據解析部分:
private void makeRequest(int method, String url, final Map<String,String> map,
final ICallBack callBack, final Object tag, final Context context, final boolean showLoad){
final StringRequest request = new StringRequest(method, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//改了這裏
if (callBack!=null)
callBack.parseData(response);
dismissIfNeed();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
if (callBack!=null) {
callBack.onFail(-2, "請求服務器失敗");
}
dismissIfNeed();
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
if (map != null)
return map;
return super.getParams();
}
};
request.setRetryPolicy(new DefaultRetryPolicy(5000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
if (tag!=null) {
request.setTag(tag);
}
requestQueue.add(request);
dialog = null;
if (showLoad && context!=null && tag!=null) {
dialog = new ProgressDialog(context);
dialog.setCancelable(false);
dialog.show();
this.tag = tag;
dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK
&& event.getAction() == MotionEvent.ACTION_UP) {
if (callBack != null && callBack.canCancel()) {
callBack.onCancel();
cancelRequest(tag);
dismissIfNeed();
}
}
return false;
}
});
}
}
到這裏封裝結束,使用方法:
new HttpUtils.RequestBuilder().bindUrl("")
.bindMap(map)
.bindShow(true)
.bindContext(this)
.bindTag("TAST")
//new ListCallBack<Bean>
.bindCallBack(new BeanCallBack<DataBean>(){
@Override
public void onSuccess(DataBean dataBean) {
Log.e("BeanCallBack", JSON.toJSONString(dataBean));
}
}).build();
其中Bean類:
@ListName("list")
public class Bean{
private String a;
private String b;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
}
結束。