package com.lzy.okhttpdemo.callback; import android.text.TextUtils; import android.widget.Toast; import com.google.gson.Gson; import com.lzy.okhttputils.OkHttpUtils; import org.json.JSONObject; import java.lang.reflect.Type; import okhttp3.Response; /** * ================================================ * 作 者:廖子尧 * 版 本:1.0 * 创建日期:2016/1/14 * 描 述:默认将返回的数据解析成需要的Bean,可以是 BaseBean,String,List,Map * 修订历史: * ================================================ */ public abstract class JsonCallback<T> extends EncryptCallback<T> { private Class<T> clazz; private Type type; public JsonCallback(Class<T> clazz) { this.clazz = clazz; } public JsonCallback(Type type) { this.type = type; } //该方法是子线程处理,不能做ui相关的工作 @Override public T parseNetworkResponse(Response response) throws Exception { String responseData = response.body().string(); if (TextUtils.isEmpty(responseData)) return null; /** * 一般来说,服务器返回的响应码都包含 code,msg,data 三部分,在此根据自己的业务需要完成相应的逻辑判断 * 以下只是一个示例,具体业务具体实现 */ JSONObject jsonObject = new JSONObject(responseData); final String msg = jsonObject.optString("msg", ""); final int code = jsonObject.optInt("code", 0); String data = jsonObject.optString("data", ""); switch (code) { case 0: /** * code = 0 代表成功,默认实现了Gson解析成相应的实体Bean返回,可以自己替换成fastjson等 * 对于返回参数,先支持 String,然后优先支持class类型的字节码,最后支持type类型的参数 */ if (clazz == String.class) return (T) data; if (clazz != null) return new Gson().fromJson(data, clazz); if (type != null) return new Gson().fromJson(data, type); break; case 104: //比如:用户授权信息无效,在此实现相应的逻辑,弹出对话或者跳转到其他页面等,该抛出错误,会在onError中回调。 throw new IllegalStateException("用户授权信息无效"); case 105: //比如:用户收取信息已过期,在此实现相应的逻辑,弹出对话或者跳转到其他页面等,该抛出错误,会在onError中回调。 throw new IllegalStateException("用户收取信息已过期"); case 106: //比如:用户账户被禁用,在此实现相应的逻辑,弹出对话或者跳转到其他页面等,该抛出错误,会在onError中回调。 throw new IllegalStateException("用户账户被禁用"); case 300: //比如:其他乱七八糟的等,在此实现相应的逻辑,弹出对话或者跳转到其他页面等,该抛出错误,会在onError中回调。 throw new IllegalStateException("其他乱七八糟的等"); default: throw new IllegalStateException("错误代码:" + code + ",错误信息:" + msg); } //如果要更新UI,需要使用handler,可以如下方式实现,也可以自己写handler OkHttpUtils.getInstance().getDelivery().post(new Runnable() { @Override public void run() { Toast.makeText(OkHttpUtils.getContext(), "错误代码:" + code + ",错误信息:" + msg, Toast.LENGTH_SHORT).show(); } }); return null; } }