介面回調封裝,回調封裝

來源:互聯網
上載者:User

介面回調封裝,回調封裝

  

 

  在開發的過程中,關於對請求回調資料的處理以及訊息提示,我發現了兩個問題:

  1.別人都怎麼做的我不知道,但是我看到的,很多人在寫網路請求的時候,不管是自己直接寫的,或者還是直接使用第三方網路架構,在拿到資料的時候,一般都是自己根據返回的資料中,使用約定好的key去解析自己需要的資料,直接使用或者轉換成javaBean、數組。話說,這樣很麻煩不是嗎,每一次請求資料就要去解析一次,不同的頁面,那得重複寫多少代碼,而且看起來也比較亂。

  2.很多時候 ,資料請求成功或者失敗,總要給使用者一個簡短的提示。提示什麼樣的文案和什麼情況下需要提示,這也是個比較麻煩的問題。

  為此,我對請求回調進行了封裝,代碼結構清晰了很多,而且也比較好用,主要做到了以下功能:

  1.如果返回的資料是javaBean或者數組Array,只需要在請求時,在請求時的CallBack傳遞對應的資料類型和JavaBean.class,這樣資料成功回調後,就可以把返回的Object 對象直接轉換成對應的 JavaBean.class 實體物件或者 Array 對象。當然,如果返回的只是簡單的資料類型的話,什麼都不需要設定就可以了,直接使用返回的 String data 即可。

  2.不管回調成功還是失敗,統一彈出提示的話,直接在請求時的CallBack中傳遞個Context 對象;不需要提示則不傳;想自己定製提示內容,則不傳,並在CallBack 中對應的 onSuccess、onFailure方法中,彈出自己想要的內容。

 

  廢話不多說了,直接上代碼~

 

  一、訊息提不提示的問題,我以擷取驗證碼介面為例。

1.不主動彈出提示訊息提示。

a.發起請求

ApiClient.getVerificationCode(phone,new VerificationCodeCallback());

b.資料回調

// 擷取驗證碼回調    public class VerificationCodeCallback extends ApiUiCallback {        @Override        public void onFailure(HttpException e, String s) {            super.onFailure(e, s);                   }        @Override        public void onSuccess(String data, int resultCode, String resultInfo, Object outDo) {            super.onSuccess(data, resultCode, resultInfo, outDo);            if (resultCode == 0) {                // TODO            }        }    }

想自己定製提示內容,在CallBack 中對應的 onSuccess、onFailure方法中,彈出自己想要的內容即可。

 

2.主動彈出提示訊息提示。

a.發起請求

ApiClient.getVerificationCode(phone,new VerificationCodeCallback(this));

b.資料回調

// 擷取驗證碼回調    public class VerificationCodeCallback extends ApiUiCallback {        public VerificationCodeCallback(Context context) {            super(context);        }        @Override        public void onFailure(HttpException e, String s) {            super.onFailure(e, s);                   }        @Override        public void onSuccess(String data, int resultCode, String resultInfo, Object outDo) {            super.onSuccess(data, resultCode, resultInfo, outDo);            if (resultCode == 0) {                // TODO            }        }    }

 

主動彈出的話,需要在回調類中 實現構造方法 VerificationCodeCallback(Context context),並在使用的時候傳遞個Context。

 

 二、資料返回Array或者 單一 JavaBean 問題

  方法說明:

setOutClass()中傳遞的是數組中的資料實體類。
setResponseTypeEnum()中傳遞的是資料的類型 單個JavaBean 還是 Array

1. 返回 Array

a.發起請求

        ApiClient.openCityList(new OpenCityListCallback().setOutClass(String.class).setResponseTypeEnum(ResponseTypeEnum.JSON_ORIGINAL_RESULT_ARRAY));

b.資料回調

public class OpenCityListCallback extends ApiUiCallback {        @Override        public void onFailure(HttpException e, String s) {            super.onFailure(e, s);            showToast(R.string.network_anomaly);        }        @Override        public void onSuccess(String data, int resultCode, String resultInfo, Object outDo) {            super.onSuccess(data, resultCode, resultInfo, outDo);            if (outDo instanceof List) {                List<String> list = (List<String>) outDo;                // TODO            } else {                showToast(resultInfo);            }        }    }

 

2. 返回 單一 JavaBean 

a.發起請求

        ApiClient.checkNewVersion(new CheckNewVersionCallback().setResponseTypeEnum(ResponseTypeEnum.JSON_ORIGINAL_RESULT_BEAN).setOutClass(UpdateInfo.class));

 

b.資料回調

 

public class CheckNewVersionCallback extends ApiUiCallback {        @Override        public void onFailure(HttpException e, String s) {            super.onFailure(e, s);        }        @Override        public void onSuccess(String data, int resultCode, String resultInfo, Object outDo) {            super.onSuccess(data, resultCode, resultInfo, outDo);            if (resultCode == 0) {                if (outDo instanceof UpdateInfo) {                    updateInfo = (UpdateInfo) outDo;                    // TODO                }            }        }    }

 

  二話不說上源碼!!!!

1. 主要的目錄結構

 

 2.  ApiConstant.class

/** * Created by ding on 2016/9/26 */public class ApiConstant {    /**     * 字元集:UTF-8     */    public static final String CHARSET_UTF8 = "UTF-8";    /**     * 預設字元集     */    public static final String DEFUALT_CHARSET = CHARSET_UTF8;}

 3.  ResponseTypeEnum.class

/** * 返回資料類型常量 * Created by ding on 2016/9/26. */public enum ResponseTypeEnum {    /**     * JSON格式字串;     * 基本類型按JSON格式原樣輸出;     * data內容封裝到Result對象的data屬性,再輸出JSON格式字串;     * data是普通JavaBean;     */    JSON_ORIGINAL_RESULT_BEAN("json_orig_result", true, false),    /**     * JSON格式字串;     * 基本類型按JSON格式原樣輸出;     * data內容封裝到Result對象的data屬性,再輸出JSON格式字串;     * data是JsonArray集合;     */    JSON_ORIGINAL_RESULT_ARRAY("json_orig_result", true, true),    /**     * 原生字串;     */    STRING("string", false, false);    private String rtType;//返回資料類型    private boolean isJson;//返回資料是否JSON格式    private boolean isArray;//返回資料是否JSON集合    private ResponseTypeEnum(String rtType, boolean isJson, boolean isArray) {        this.rtType = rtType;        this.isJson = isJson;        this.isArray = isArray;    }    public String getRtType() {        return rtType;    }    public boolean isArray() {        return isArray;    }    public boolean isJson() {        return isJson;    }}

 

4.  ApiConvert.class

/** * Created by ding on 2016/9/26 *convert層轉換工具類 * 提供jsonData 和outputDo的轉換方法 */public class ApiConvert {    private static final String TAG = "api.ApiConvert";    /**     * 將json格式的byte數組資料轉換為業務JavaBean執行個體對象     *     * @param jsonData JSON格式的String字串     * @param outClass 業務JavaBean的類資訊     * @return Object outClass對應的業務JavaBean執行個體對象     */    public static Object jsonToOutputDO(String jsonData, ResponseTypeEnum responseType, Class<?> outClass) {        if ((outClass == null) || TextUtils.isEmpty(jsonData)) {            LogUtil.LogE(ApiConvert.class, "outClass is null or jsonData is blank.");            return null;        }        try {            if ((responseType != null) && responseType.isJson()) {                if (responseType.isArray()) {                    return JSON.parseArray(jsonData, outClass);                } else {                    return JSON.parseObject(jsonData, outClass);                }            } else {                return jsonData;            }        } catch (Throwable e) {            LogUtil.LogE(ApiConvert.class, "[jsonToOutputDO]invoke JSON.parseObject error.");        }        return null;    }}

 

5.  ApiUiCallback.class

 

/** * Created by ding on 2016/9/26. */public abstract class ApiUiCallback extends RequestCallBack<String> {    protected Context mContext = null;    private ResponseTypeEnum responseTypeEnum = null;    private Class<?> outClass = null;    private String reqContent;//    public ApiUiCallback() {        this.mContext = null;    }    public ApiUiCallback(Context context) {        this.mContext = context;    }    public ApiUiCallback(int rate) {        super(rate);        this.mContext = null;    }    public ApiUiCallback(Object userTag) {        super(userTag);        this.mContext = null;    }    public ApiUiCallback(int rate, Object userTag) {        super(rate, userTag);        this.mContext = null;    }    public ApiUiCallback setResponseTypeEnum(ResponseTypeEnum responseTypeEnum) {        this.responseTypeEnum = responseTypeEnum;        return this;    }    public ApiUiCallback setOutClass(Class<?> outClass) {        this.outClass = outClass;        return this;    }    public ApiUiCallback setReqContent(String reqContent) {        this.reqContent = reqContent;        return this;    }    public String getReqContent() {        return reqContent;    }    @Override    public void onSuccess(ResponseInfo<String> responseInfo) {        String json = CommonUtil.fromtoJson(responseInfo.result);        LogUtil.LogE(ApiUiCallback.class, "ApiUiCallback--->onSuccess");        if (null != json) {            JSONObject object = JSON.parseObject(json,                    JSONObject.class);            int resultCode = object.getInteger("resultCode");            String resultInfo = object.getString("resultInfo");            String jsonData = object.getString("data");            if (mContext != null) {                ToastTools.showToast(mContext, resultInfo);            }            Object outDO = ApiConvert.jsonToOutputDO(jsonData, responseTypeEnum, outClass);            onSuccess(jsonData, resultCode, resultInfo, outDO);        }    }    public void onSuccess(String data, int resultCode, String resultInfo, Object outDo) {    }    @Override    public void onFailure(HttpException e, String s) {        LogUtil.LogE(ApiUiCallback.class, "ApiUiCallback--->onFailure");        if (mContext != null) {            ToastTools.showToast(mContext, "請求失敗");        }    }}

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.