-
Notifications
You must be signed in to change notification settings - Fork 7.6k
某些异常无法触发onError #8090
Description
下面是rxjava2+Retrofit2 的请求日志,能正常触发onError,当时当我切换为rxjava3时,发生 SocketException: Socket closed或者 IOException: Cancel 等异常中断请求类型的异常时,无法触发onError,希望能修复此问题或者有没有方案可以避免此类问题,
其他:可以通过防火墙模拟这种场景
┌────── HTTP Request Failed ───────────────────────────────────────────
│ [REQUEST]
│ Method: POST
│ URL: http://10.18.80.17:9102/request
│
│ [ERROR]
│ SocketException: Socket closed
└───────────────────────────────────────────────────────────────────────
onError
java.io.InterruptedIOException: timeout
at okhttp3.internal.connection.RealCall.timeoutExit(RealCall.kt:398)
at okhttp3.internal.connection.RealCall.callDone(RealCall.kt:360)
at okhttp3.internal.connection.RealCall.noMoreExchanges$okhttp(RealCall.kt:325)
at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:209)
at okhttp3.internal.connection.RealCall.execute(RealCall.kt:154)
这是请求的源代码:通过 Observable.fromCallable(() 则可以触发onError,但是直接使用Observable 则无法触发
Map<String, Object> params = new HashMap<>();
params.put("sn", DeviceUtils.getSN());
params.put("licenseStr", LIC);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://10.18.80.17:9102/") // 你的 baseUrl
.client(HttpManager.getInstance().getOkHttpClient()) // 使用同一个 OkHttpClient
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(HttpManager.getInstance().getGson()))
.build();
ApiService apiService = retrofit.create(ApiService.class);
// Observable.fromCallable(() -> {
// // 获取同步 Call 对象
// Call<ApiResponse> call = apiService.activate(buildUrl(ApiUrl.ACTIVATE), getJsonBodyFromObject(params));
// Response<ApiResponse> response = call.execute();
// if (response.isSuccessful()) {
// return response.body();
// } else {
// // 处理 HTTP 错误(如 4xx, 5xx)
// String errorBody = response.errorBody() != null ? response.errorBody().string() : "";
// throw new HttpException(response); // 或自定义异常
// }
// })
apiService.activate1(buildUrl(ApiUrl.ACTIVATE), getJsonBodyFromObject(params))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ApiResponse<ActivateResult>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
GxLogger.d(TAG, "onSubscribe");
}
@Override
public void onNext(@NonNull ApiResponse<ActivateResult> response) {
GxLogger.i(TAG, "onNext: " + response);
}
@Override
public void onError(@NonNull Throwable e) {
GxLogger.e(TAG, "onError", e);
}
@Override
public void onComplete() {
GxLogger.d(TAG, "onComplete");
}
});