135 lines
5.2 KiB
Java
135 lines
5.2 KiB
Java
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<T> implements Callback<BaseModel<T>> {
|
||
private Context mContext;
|
||
|
||
// 构造方法,传入上下文用于显示提示
|
||
public ApiResponseCallback(Context context) {
|
||
this.mContext = context;
|
||
}
|
||
|
||
@Override
|
||
public void onResponse(Call<BaseModel<T>> call, Response<BaseModel<T>> response) {
|
||
// 统一处理HTTP响应
|
||
if (response.isSuccessful()) {
|
||
// 处理200-299范围内的HTTP状态码
|
||
BaseModel<T> 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<BaseModel<T>> 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);
|
||
}
|
||
}
|