第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在 RxJava 中使用 onErrorReturn 和 retryWhen

在 RxJava 中使用 onErrorReturn 和 retryWhen

慕尼黑8549860 2023-09-20 15:22:10
這是代碼:import io.reactivex.Observable;import io.reactivex.Observer;import org.junit.jupiter.api.Test;import java.util.concurrent.ThreadLocalRandom;import java.util.concurrent.atomic.AtomicBoolean;public class RxJavaTest {    @Test    public void onErr() {        Observable<String> values1 = new Observable<String>() {            @Override            protected void subscribeActual(Observer<? super String> observer) {                observer.onNext("New");                observer.onNext("New1");                observer.onNext("New2");                observer.onNext("New3");                observer.onNext("New4");                if (ThreadLocalRandom                            .current()                            .nextInt(10) == 5) {                    observer.onError(new Exception("don't retry..."));                } else {                    observer.onError(new IllegalArgumentException("retry..."));                }            }        };        AtomicBoolean finished = new AtomicBoolean(false);        values1                .retryWhen(throwableObservable -> throwableObservable                        .takeWhile(throwable -> {                            boolean result = (throwable instanceof IllegalArgumentException);                            if (result) {                                System.out.println("Retry on error: " + throwable);                                return result;                            }                            System.out.println("Error: " + throwable);                            return result;                        })                        .take(20))                .onErrorReturn(throwable -> "Saved the day!")                .doOnTerminate(() -> finished.set(true))                .subscribe(v -> System.out.println(v));    }}目標(biāo)是僅當(dāng)存在IllegalArgumentException,對(duì)于任何其他異常,立即返回(通過onErrorReturn)。上面的代碼實(shí)現(xiàn)了第一個(gè)目標(biāo),但第二個(gè)目標(biāo)失敗了,它停止重試,但忽略了該.onErrorReturn部分。知道如何讓它發(fā)揮作用嗎?
查看完整描述

2 回答

?
慕蓋茨4494581

TA貢獻(xiàn)1850條經(jīng)驗(yàn) 獲得超11個(gè)贊

您可以將其更改retryWhen為:


                .retryWhen(throwableObservable ->

                                throwableObservable.flatMap(throwable -> {

                                    if (throwable instanceof IllegalArgumentException) {

                                        System.out.println("Retry on error: " + throwable);

                                        return Observable.just(1);

                                    } else {

                                        System.out.println("Error: " + throwable);

                                        return Observable.<Integer>error(throwable);

                                    }

                                })

                )

為了使其重試,返回哪個(gè)值并不重要retryWhen(在上面的示例中返回 1)。根據(jù)javadoc:


如果 ObservableSource 調(diào)用 onComplete 或 onError,則重試將在子訂閱上調(diào)用 onComplete 或 onError。否則,此 ObservableSource 將重新訂閱源 ObservableSource。


查看完整回答
反對(duì) 回復(fù) 2023-09-20
?
慕田峪9158850

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超7個(gè)贊

作為記錄,這是我在看到古斯塔沃的答案之前使用的解決方案onErrorResumeNext:


    private Observable<String> createObservable(long delay) {

        Observable<String> values1 = new Observable<String>() {

            @Override

            protected void subscribeActual(Observer<? super String> observer) {

                observer.onNext("New");

                observer.onNext("New1");

                observer.onNext("New2");

                observer.onNext("New3");

                observer.onNext("New4");

                if (ThreadLocalRandom

                        .current()

                        .nextInt(8) == 2) {

                    observer.onError(new RuntimeException("don't retry..."));

                } else {

                    observer.onError(new IllegalArgumentException("retry..."));

                }

            }

        };

        return Observable.timer(delay, TimeUnit.SECONDS).flatMap(aLong -> values1)

                .onErrorResumeNext((Throwable throwable) -> {

                    if (throwable instanceof IllegalArgumentException) {

                        return createObservable(delay + 2);

                    } else {

                        return Observable.just("The default value");

                    }

                });

    }

這按預(yù)期工作,但我認(rèn)為古斯塔沃建議的方式更容易理解。這是使用以下重寫的相同函數(shù)retryWhen:


    private Observable<String> createObservable1() {

        Observable<String> values1 = new Observable<String>() {

            @Override

            protected void subscribeActual(Observer<? super String> observer) {

                observer.onNext("New");

                observer.onNext("New1");

                observer.onNext("New2");

                observer.onNext("New3");

                observer.onNext("New4");

                if (ThreadLocalRandom

                        .current()

                        .nextInt(3) == 1) {

                    observer.onError(new RuntimeException("don't retry..."));

                } else {

                    observer.onError(new IllegalArgumentException("retry..."));

                }

            }

        };

        return values1.retryWhen(throwableObservable ->

                throwableObservable

                        .zipWith(Observable.range(1, 5), (throwable, integer) -> {

                            if (throwable instanceof IllegalArgumentException) {

                                System.out.println("Retry on error: " + throwable);

                                return integer;

                            }

                            System.out.println("No retry on error: " + throwable);

                            return -1;

                        })

                        .flatMap(integer -> {

                            if (integer > 0) {

                                System.out.println("Delay " + integer + " sec on retry...");

                                return Observable.timer(integer, TimeUnit.SECONDS);

                            }

                            System.out.println("Return immediately...");

                            return Observable.error(new Exception());

                        })

        ).onErrorReturnItem("Saved the day!");

    }

希望這可以幫助。


查看完整回答
反對(duì) 回復(fù) 2023-09-20
  • 2 回答
  • 0 關(guān)注
  • 188 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)