102 lines
3.5 KiB
Java
102 lines
3.5 KiB
Java
package com.xscm.moduleutil.http;
|
||
|
||
|
||
import com.blankj.utilcode.util.ToastUtils;
|
||
import com.google.gson.Gson;
|
||
import com.google.gson.JsonParseException;
|
||
import com.google.gson.TypeAdapter;
|
||
import com.xscm.moduleutil.utils.GsonUtils;
|
||
|
||
import java.io.IOException;
|
||
|
||
import io.reactivex.annotations.NonNull;
|
||
import okhttp3.ResponseBody;
|
||
import retrofit2.Converter;
|
||
|
||
public class ResponseBodyConverter<T> implements Converter<ResponseBody, T> {
|
||
|
||
private final Gson gson;
|
||
private final TypeAdapter<T> adapter;
|
||
|
||
ResponseBodyConverter(Gson gson, TypeAdapter<T> adapter) {
|
||
this.gson = gson;
|
||
this.adapter = adapter;
|
||
}
|
||
|
||
@Override
|
||
public T convert(@NonNull ResponseBody value) throws IOException {
|
||
String json = value.string();
|
||
try {
|
||
BaseModel obj = GsonUtils.GsonToBean(json, BaseModel.class);
|
||
if (obj.getCode() != 1) {
|
||
String info = obj.getMsg();
|
||
if ("当前余额不足".equals(info)) {
|
||
value.close();
|
||
return parseDataSafely(json);
|
||
} else {
|
||
if (!info.contains("更新失败")) {
|
||
// ToastUtils.showShort(info);
|
||
}
|
||
// throw new APIException(obj.getCode(), info);
|
||
}
|
||
}
|
||
value.close();
|
||
return parseDataSafely(json);
|
||
} catch (Exception e) {
|
||
// 处理解析异常,避免崩溃
|
||
value.close();
|
||
try {
|
||
// 尝试返回默认值
|
||
return createDefaultInstance();
|
||
} catch (Exception ex) {
|
||
return null;
|
||
}
|
||
}
|
||
}
|
||
/**
|
||
* 安全地解析数据,处理各种可能的返回类型
|
||
*/
|
||
private T parseDataSafely(String json) {
|
||
try {
|
||
return adapter.fromJson(json);
|
||
} catch (IOException | JsonParseException e) {
|
||
// 当解析失败时,尝试其他方式处理
|
||
try {
|
||
// 尝试返回默认值
|
||
return createDefaultInstance();
|
||
} catch (Exception ex) {
|
||
return null;
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 创建默认实例以避免null返回
|
||
*/
|
||
@SuppressWarnings("unused")
|
||
private T createDefaultInstance() {
|
||
try {
|
||
// 对于基本类型和常见集合类型,返回默认值
|
||
Class<?> rawType = adapter.getClass();
|
||
if (rawType.isAssignableFrom(String.class)) {
|
||
return (T) "";
|
||
} else if (rawType.isAssignableFrom(Boolean.class) || rawType.isAssignableFrom(boolean.class)) {
|
||
return (T) Boolean.FALSE;
|
||
} else if (rawType.isAssignableFrom(Integer.class) || rawType.isAssignableFrom(int.class)) {
|
||
return (T) Integer.valueOf(0);
|
||
} else if (rawType.isAssignableFrom(Long.class) || rawType.isAssignableFrom(long.class)) {
|
||
return (T) Long.valueOf(0L);
|
||
} else if (rawType.isAssignableFrom(Double.class) || rawType.isAssignableFrom(double.class)) {
|
||
return (T) Double.valueOf(0.0);
|
||
} else if (rawType.isAssignableFrom(Float.class) || rawType.isAssignableFrom(float.class)) {
|
||
return (T) Float.valueOf(0.0f);
|
||
} else {
|
||
// 对于其他类型,返回null而不是抛出异常
|
||
return null;
|
||
}
|
||
} catch (Exception e) {
|
||
return null;
|
||
}
|
||
}
|
||
}
|