package com.zenglb.framework.http.core; import android.content.Context; import android.content.Intent; import android.support.annotation.CallSuper; import android.util.Log; import android.widget.Toast; import com.google.gson.Gson; import com.zenglb.baselib.utils.TextUtils; import com.zenglb.framework.activity.access.LoginActivity; import java.io.IOException; import java.net.ConnectException; import java.net.SocketTimeoutException; import java.net.UnknownHostException; import java.net.UnknownServiceException; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; /** * 2017.04.15 以后不再维护,使用Rxjava2+ retrofit 结合的吧! */ @Deprecated public abstract class HttpCallBack<T> implements Callback<HttpResponse<T>> { private final String TAG = HttpCallBack.class.getSimpleName(); private static Gson gson = new Gson(); private final int RESPONSE_CODE_OK = 0; //自定义的业务逻辑,成功返回积极数据 private final int RESPONSE_CODE_FAILED = -1; //返回数据失败 private Context mContext; /** * 根据具体的Api 业务逻辑去重写 onSuccess 方法! * * @param t */ public abstract void onSuccess(T t); /** * @param mContext */ public HttpCallBack(Context mContext) { this.mContext = mContext; HttpUiTips.showDialog(mContext, true, "loading..."); } /** * @param mContext * @param showProgress 默认需要显示进程,不要的话请传 false */ public HttpCallBack(Context mContext, boolean showProgress) { this.mContext = mContext; HttpUiTips.showDialog(mContext, true, null); } /** * Default error dispose! * 一般的就是 AlertDialog 或 SnackBar * * @param code * @param message */ @CallSuper //if overwrite,you should let it run. public void onFailure(int code, String message) { if (code == RESPONSE_CODE_FAILED && mContext != null) { HttpUiTips.alertTip(mContext, message, code); } else { disposeEorCode(message, code); } } /** * Invoked for a received HTTP response. * <p> * Note: An HTTP response may still indicate an application-level failure such as a 404 or 500. * Call {@link Response#isSuccessful()} to determine if the response indicates success. */ @Override public final void onResponse(Call<HttpResponse<T>> call, Response<HttpResponse<T>> response) { HttpUiTips.dismissDialog(mContext); if (response.isSuccessful()) { //mean that code >= 200 && code < 300 int responseCode = response.body().getCode(); //responseCode是业务api 里面定义的,根据responseCode进行进一步的数据和事件分发! if (responseCode == RESPONSE_CODE_OK) { onSuccess(response.body().getResult()); } else { onFailure(responseCode, response.body().getError()); } } else { //================ 1.handle http default error 4xx,5xx================= int code = response.raw().code(); String message = response.raw().message(); //code 和 message 都是http Raw 数据,你抓包就能看见的 Log.e("http-error", "code:" + code + " message:" + message); //我们的项目返回404 的时候有可能是翻页到没有数据了,这一点很恶心 if (code != 404) { onFailure(code, message); return; } //================ 2.把项目业务方面定义的错误提取处理处理,和业务逻辑,api 有关================= String errorBodyStr = ""; try { //我们的项目需要的UniCode转码,不是必须要的! errorBodyStr = TextUtils.convertUnicode(response.errorBody().string()); } catch (IOException ioe) { Log.e("errorBodyStr ioe:", ioe.toString()); } try { HttpResponse errorResponse = gson.fromJson(errorBodyStr, HttpResponse.class); if (null != errorResponse) { onFailure(errorResponse.getCode(), errorResponse.getError()); //这里的code 如果定义和public void onFailure(Call<T> call, Throwable t) { 一样,要记得分开处理 } else { onFailure(RESPONSE_CODE_FAILED, "ErrorResponse is null "); //!!!!!! } } catch (Exception jsonException) { onFailure(RESPONSE_CODE_FAILED, "http请求错误Json 信息异常"); // jsonException.printStackTrace(); } }//response is not Successful dispose over ! } /** * 区别处理Htpp error 和 业务逻辑的Error code ,如果有重复,需要区别处理 * <p> * Invoked when a network exception occurred talking to the server or when an unexpected * exception occurred creating the request or processing the response. */ @Override public final void onFailure(Call<HttpResponse<T>> call, Throwable t) { HttpUiTips.dismissDialog(mContext); String temp = t.getMessage().toString(); String errorMessage = "获取数据失败[def-error]" + temp; if (t instanceof SocketTimeoutException) { errorMessage = "服务器响应超时"; } else if (t instanceof ConnectException) { errorMessage = "网络连接异常,请检查网络"; } else if (t instanceof RuntimeException) { errorMessage = "运行时错误"; } else if (t instanceof UnknownHostException) { errorMessage = "无法解析主机,请检查网络连接"; } else if (t instanceof UnknownServiceException) { errorMessage = "未知的服务器错误"; } onFailure(RESPONSE_CODE_FAILED, errorMessage); } /** * 对通用问题的统一拦截处理 * * @param code */ private void disposeEorCode(String message, int code) { switch (code) { case 101: case 112: case 123: case 401: //退回到登录页面 Intent intent = new Intent(); intent.setClass(mContext, LoginActivity.class); mContext.startActivity(intent); break; } Toast.makeText(mContext, message + " # " + code, Toast.LENGTH_SHORT).show(); } }