[英]Transform Observable onError and emit an item
在我的Android應用程序中,我有一個生成的(Swagger)ApiClient,它使用令牌進行初始化以標識用戶。
該令牌(來自服務器)可以過期。
我通過myApiClient.myServiceMethod(params)從我的Web服務中獲得了帶數據的Observable。
當我從服務器獲得401時,這意味着我的令牌已過期,並且我必須再次初始化myApiClient(以使用未過期的令牌獲取它)。
myApiClient的初始化方式。 它由getMyApiClient()返回。
//getOkHttpClientWithToken() first issues another Server call to get an
//unexpired Token and then returns an OkHttpClient with that Token set.
myApiClient = new ApiClient()
.getAdapterBuilder()
.baseUrl(url)
.client(getOkHttpClientWithToken())
.build()
.create(MyApiClient.class);
我從myApiClient調用中獲得了Observable
Observable<Result> getResultObservable(Type param1, Type param2) {
return Observable.just(getMyApiClient())
.flatMap(myApiClient ->
myApiClient.getResult(param1, param2).cache()
);
}
我試過的是
//How to recreate myApiClient and Retry call on new myApiClient when an Error occurs
getResultObservable(param1, param2)
.take(1)
.subscribe(result -> {
doSomethingWithResult();
}
});
可以工作,但對每個錯誤(不僅僅是401)都可以完成,並且可能永遠都不會結束
我需要類似的東西
getResultObservable(param1, param2)
.take(1)
.subscribe(result -> {
doSomethingWithResult();
}, e -> {
if(e.getMessage.equals("HTTP 401")) {
"Transform this Observable to getResultObservable with new myApiClient and emit Result in onNext"
} else {
"Other error inform User and stop."
}
}
});
您可以使用Observable#onErrorResumeNext提供后備可觀察的。 如果滿足給定條件,則可以檢查異常的類型,並返回fallback-observable,或者僅將異常包裝為Observable#error。
請查看測試,如何在發生某些異常時使用#onErrorResumNext來提供備用備用。
@Test
void nameX() {
Observable<String> stringObservable = get();
Observable<String> fallback$ =
stringObservable
.doOnError(s -> System.out.println("fail -> " + s.getMessage()))
.onErrorResumeNext(
throwable -> {
if (throwable instanceof MyException) {
return fallBack().doOnNext(s -> System.out.println("use fallback value " + s));
} else {
return Observable.error(throwable);
}
});
fallback$
.test()
.assertNotComplete()
.assertValueCount(1)
.assertValueAt(0, s -> "Wurst".equals(s));
}
private Observable<String> get() {
return Observable.error(new MyException("Fail"));
}
private Observable<String> fallBack() {
return Observable.just("Wurst").mergeWith(Observable.never());
}
private static final class MyException extends Exception {
MyException(String message) {
super(message);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.