いくつかのロックonError()、またはonComplete()を解放する必要があるRxJavaチェーン要求がありますので、基本的に私の問題は何ですか:私が読み込みを設定し、 OkHttpClient、私は希望の動作を取得しません。 、HTTPが失敗しました:java.net.SocketException:Socket closed;例外処理メソッドを起動しません
public <T extends Response> Observable<T> doSomething(Observable<T> base) {
isLocked = true;
return someApiCall()
.flatMap(apiResponse -> handleResponse(apiResponse, base)
.doOnError(throwable -> {
isLocked = false;
})
.doOnCompleted(() -> {
isLocked = false;
}));
}
handleResponse()
別のAPI呼び出しを行い、Observable<Response<Something>>
を返しますが:ここで私が持っているチェーン要求の簡易版だ
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.readTimeout(30, TimeUnit.SECONDS)
.connectTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
OkHttpClient okHttpClient = builder.build();
:私はここに私の単純化クライアントだRetrofit2とOkHttp3.6.0を使用しています私が言ったように、それは時々HTTP FAILED: java.net.SocketException: Socket closed
で失敗し、Observableを終了しないので、onError()またはonComplete()は決して呼び出されません。私はonTerminate()も試みましたが、運がありません。 OkHttlClient
からタイムアウト設定を削除すると、SocketException
が実際にスローされて捕捉され、isLocked
変数を解放します。私はhandleResponse()
の返信文をtry {} catch (Exception e) {}
ブロックでラップしようとしましたが、カスタムタイムアウトが設定されている場合でもSocketException
をキャッチしません。何か案は?
handleResponseもまたRetrofitコールを行いますか?あなたは「観察可能なものを完成させる」と何を定義しますか? doOnErrorを適用しているように見えるかもしれません/内部のflatMappedで完了しました。someApiCall()は失敗し、キャッチしません。 – yosriz
はい、Retrofit呼び出しを行います。私はこれを単純化したチェーンだと言いますが、実際のものはoriginalApiCall(失敗) - > apiCallOne - > apiCallTwo - > originalApiCall(セッション更新チェーン)です。doOnError()とdoOnTerminateの両方を外部呼び出しに追加しようとしました。運がない。問題は、SocketExceptionを除いて、他のすべての例外がチェーン内でキャッチされていることです。 –
okです。だから、SocketExceptionはどうなりますか?それがどういうふうに分かったのですか? – yosriz