如何使用延迟和重试过滤响应:RxJava

时间:2016-04-16 11:39:27

标签: rx-java rx-android

初学者到RxJava,其中一个问题是调用一个返回observable boolean的方法。如果方法返回true而不是exit,如果为false则重试。它需要以延迟逻辑多次完成。例如,如果值为真,则每30秒重试一次。

这是我的可观察方法

@RxLogObservable
    public rx.Observable<Boolean> checkForCatalogDownloadSuccess() {
        return rx.Observable.create(new rx.Observable.OnSubscribe<Boolean>() {
            @Override
            public void call(Subscriber<? super Boolean> subscriber) {
                try {
                    String catalogDownloadStatus = mSnappyDBManager.getStringFromSnappy(SnappyDBManager.CATALOG_DOWNLOAD_STATUS);
                    CatalogDownloadStatus downloadStatus = CatalogDownloadStatus.valueOf(catalogDownloadStatus);
                    CatalogDownloadResponse catalogDownloadResponse = new CatalogDownloadResponse();

                    if(downloadStatus == CatalogDownloadStatus.SUCCESS ) {
                        subscriber.onNext(true);
                    }
                    else {
                    subscriber.onNext(false);
                    }

                    subscriber.onCompleted();

                } catch (Exception ex) {
                    Timber.e(ex, null);
                }
            }
        };
    }

1 个答案:

答案 0 :(得分:1)

如果您有一个Boolean可观察对象并且想要重新订阅(比如3次)false或者如果在一段时间内没有收到任何消息(例如5秒),那么您可以使用以下内容声明实现这一目标:

subscription = observable.map(s -> {
            if (!s) {
                throw new RuntimeException();
            }
            return true;
        }).timeout(5, TimeUnit.SECONDS,scheduler)
                .retry(3)
                .take(1)
                .subscribe(subscriber);

提供超时调度程序是可选的,但在您想要测试方法时会派上用场。