package com.xscm.moduleutil.http; import android.content.Context; import android.widget.Toast; import com.blankj.utilcode.util.LogUtils; import com.blankj.utilcode.util.ToastUtils; import com.xscm.moduleutil.base.CommonAppContext; import org.greenrobot.eventbus.EventBus; import java.io.IOException; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; /** * 通用的API响应处理回调类 * 统一处理所有接口的响应和错误情况 */ public abstract class ApiResponseCallback implements Callback> { private Context mContext; // 构造方法,传入上下文用于显示提示 public ApiResponseCallback(Context context) { this.mContext = context; } @Override public void onResponse(Call> call, Response> response) { // 统一处理HTTP响应 if (response.isSuccessful()) { // 处理200-299范围内的HTTP状态码 BaseModel body = response.body(); if (body != null) { // 根据code值进行不同处理 switch (body.getCode()) { case 1: // 接口返回成功 // 业务成功,回调给具体实现 // 即使data为null也调用onSuccess,由具体实现决定如何处理null值 onSuccess(body.getData()); break; case 0: // 接口请求成功但数据错误 // 显示错误信息 // String errorMsg = body.getMsg() != null ? body.getMsg() : "操作失败,请重试"; // showToast(errorMsg); onFailure(new Exception(body.getMsg())); break; case 301: // 登录失效 // 显示错误信息并退出应用 // String loginErrorMsg = body.getMsg() != null ? body.getMsg() : "登录已失效,请重新登录"; showToast(body.getMsg()); try { // 发送退出登录事件 // EventBus.getDefault().post(new com.xscm.moduleutil.event.LogOutEvent()); // 清除登录信息 CommonAppContext.getInstance().clearLoginInfo(); // 跳转到登录页面 // android.content.Intent intent = new android.content.Intent(CommonAppContext.getInstance(), Class.forName("com.xscm.midi.LaunchPageActivity")); // intent.addFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK | android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK); // CommonAppContext.getInstance().startActivity(intent); } catch (Exception e) { e.printStackTrace(); } onFailure(new Exception(body.getMsg())); break; default: // 其他错误情况 String defaultErrorMsg = body.getMsg() != null ? body.getMsg() : "未知错误"; showToast(defaultErrorMsg); onFailure(new Exception(defaultErrorMsg)); break; } } else { // 响应体为空的情况 String errorMsg = "获取数据失败,请重试"; showToast(errorMsg); onFailure(new Exception(errorMsg)); } } else { // 处理HTTP错误状态码 String errorInfo; try { if (response.errorBody() != null) { errorInfo = response.errorBody().string(); // 可以在这里统一解析错误响应体 } else { errorInfo = "请求失败,状态码:" + response.code(); } } catch (IOException e) { errorInfo = "请求失败,状态码:" + response.code(); e.printStackTrace(); } showToast(""); onFailure(new Exception(errorInfo)); } } @Override public void onFailure(Call> call, Throwable t) { // 统一处理网络异常 String errorMsg; if (t instanceof IOException) { // errorMsg = "网络异常,请检查网络连接"; } else { // errorMsg = "请求处理失败,请重试"; } showToast(""); // 回调给具体实现处理 onFailure(t); } // 显示提示信息 private void showToast(String message) { if (mContext != null) { Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show(); } } // 业务成功时的回调,由具体接口实现 public abstract void onSuccess(T data); // 错误时的回调,可选实现 public void onFailure(Throwable t) { // 可以留空,由子类选择性实现 LogUtils.e("接口错误:",t); } }