我有一個RxJava鏈請求應該釋放一些鎖的onError(),或的onComplete(),所以,基本上,我的問題是什麼:當我設置讀取超時連接,並寫信給我OkHttpClient,我沒有得到所需的行爲。我使用Retrofit2和OkHttp3.6.0這裏是我的簡化客戶端:HTTP失敗:java.net.SocketException:套接字關閉;不會引發異常處理方法
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.readTimeout(30, TimeUnit.SECONDS)
.connectTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
OkHttpClient okHttpClient = builder.build();
這裏的鏈請求我有一個簡化版本:
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>>
但是,正如我所說的,它有時會失敗,並且它不會完成Observable,所以,onError()或onComplete()永遠不會被調用。我也嘗試了onTerminate(),但沒有運氣。當我從OkHttlClient
刪除超時設置時,SocketException
實際上被拋出並被捕獲,釋放了isLocked
變量。我試過用try {} catch (Exception e) {}
塊封裝handleResponse()
return語句,但即使在設置了自定義超時時也不能捕獲SocketException
。有任何想法嗎?
做handleResponse做Retrofit調用嗎?你怎麼定義「完成可觀察」?任何問題怎麼可能是因爲它似乎是你申請的doOnError /竣工剛上稱爲內flatMapped,於是 - someApiCall()可能會失敗,你會不會抓住它 – yosriz
是它確實做了改造通話。正如我提到這是一個簡單的鏈條中,真正應該是originalApiCall(失敗) - > apiCallOne - > apiCallTwo - > originalApiCall(這是一個會話更新鏈)我試着將兩個doOnError()和doOnTerminate到外打電話,但沒有運氣。問題是除了Socket關閉的 –
好了,我明白了,所有其他異常都會在鏈中被捕獲,那麼SocketException會發生什麼?你怎麼知道這是exepction? – yosriz