我有两种错误。我自己从服务器和网络错误发送的那些。我从服务器发送的那些我在转换器中处理的内容:
public class RestResponseConverter<T> implements Converter<ResponseBody, T> {
private final Converter<ResponseBody, RestResponse<T>> delegate;
public RestResponseConverter(Converter<ResponseBody, RestResponse<T>> delegate) {
this.delegate = delegate;
}
@Override
public T convert(@NonNull ResponseBody responseBody) throws IOException {
RestResponse<T> restResponse = delegate.convert(responseBody);
if (restResponse.getError() != null) {
throw new ApiNfpException(restResponse.getError().getMessage());
}
return restResponse.getResponse();
}
}
对于networck例外,我有拦截器:
public class AuthHeaderInterceptor implements Interceptor {
private final UserStorage userStorage;
private final Context context;
public AuthHeaderInterceptor(UserStorage userStorage, Context context) {
this.userStorage = userStorage;
this.context = context;
}
@Override
public Response intercept(@NonNull Chain chain) throws IOException {
String authToken = userStorage.getUserProfile().getAuthToken();
Request request = chain.request().newBuilder().addHeader("X-Authorization", authToken).build();
try {
Response response = chain.proceed(request);
if (response.code() == 401) {
clearAuthUser();
throw new IOException(context.getString(R.string.no_auth_token));
}
if (response.code() == 403) {
clearAuthUser();
throw new IOException(context.getString(R.string.wrong_auth_token));
}
return response;
} catch (ConnectException e) {
throw new IOException(context.getString(R.string.connection_error));
} catch (SocketTimeoutException e) {
throw new IOException(context.getString(R.string.timeout_exception));
}
}
private void clearAuthUser() {
Intent intent = new Intent(context, StartActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); // this will clear all the stack
context.startActivity(intent);
userStorage.clearUserProfile();
new Thread(() -> {
try {
FirebaseInstanceId.getInstance().deleteInstanceId();
FirebaseInstanceId.getInstance().getToken();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
}
我需要处理403错误并注销。但我不喜欢这种实现。怎么做得更准确?
我可以处理onError回调中的错误吗?