編輯:關於android開發
在開發的過程中,關於對請求回調數據的處理以及消息提示,我發現了兩個問題:
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, "請求失敗");
}
}
}
Android Design Support Library——TabLayout,androidtablayout
Android Design Support Library——TabLayout,androidtablayout TabLayout——選項
狀態可以通過動畫切換的按鈕--第三方開源--TickPlusDrawable,tickplusdrawable
狀態可以通過動畫切換的按鈕--第三方開源--TickPlusDrawable,tickplusdrawable Android tickplusdrawab
第三方開源框架的下拉刷新列表(QQ比較常用的)。,開源框架
第三方開源框架的下拉刷新列表(QQ比較常用的)。,開源框架PullToRefreshListView是第三方開源框架下拉刷新列表,比較流行的QQ 微信等上面都在用。 下載
(轉)根據ImageView的大小來壓縮Bitmap,避免OOM,imageviewoom
(轉)根據ImageView的大小來壓縮Bitmap,避免OOM,imageviewoom本文轉載於:http://www.cnblogs.com/tianzhijiex