Volley之返回數據封裝

本文是對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;
        }
    }

結束。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章