使用rxjava2测试直到成功

时间:2019-01-12 03:22:22

标签: android rx-java rx-java2

使用rxjava2实施以下测试的正确方法是什么?

给出一个ntp服务器列表,对每个服务器进行测试,直到成功为止。

示例:

  • time.nist.gov->超时
  • pool.ntp.org->超时
  • time.google.com->成功,获取日期
  • time.apple.com->忽略

我不想并行测试所有内容,而是一一测试。如果全部失败,它将再次重新启动测试。

仅使用一台服务器,我正在使用的代码是这样:

public void getTime() {
    timeObservable = Observable
            .fromCallable(new Callable<Date>() {
                @Override
                public Date call() throws IOException {
                    return connectAndGetTime(HOST);
                }
            })
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .doOnError(new Consumer<Throwable>() {
                @Override
                public void accept(Throwable error) {
                    Timber.tag(TAG).e(error);
                }
            })
            .retry(5);

    timeObservable.subscribe(new Consumer<Date>() {
        @Override
        public void accept(Date date) {
            mDate = date;
        }
    }, new Consumer<Throwable>() {
        @Override
        public void accept(Throwable throwable) {
            Timber.tag(TAG).e(throwable);
        }
    });
}

谢谢!

1 个答案:

答案 0 :(得分:0)

谢谢阿列克谢,你是对的。 为什么使事情复杂化?

最终结果如下:

public void getTime() {
    timeObservable = Observable
            .fromCallable(new Callable<Date>() {
                @Override
                public Date call() {
                    for (String host : Arrays.asList("time.google.com", "time.apple.com", "time.nist.gov")) {
                        try {
                            return connectAndGetTime(host);
                        } catch (Exception e) {
                            Timber.tag(TAG).d("Sync (%s) fail!", host);
                        }
                    }
                    return null;
                }
            })
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .doOnError(new Consumer<Throwable>() {
                @Override
                public void accept(Throwable error) {
                    Timber.tag(TAG).e(error);
                }
            })
            .retry(5);

    timeObservable.subscribe(new Consumer<Date>() {
        @Override
        public void accept(Date date) {
            mDate = date;
        }
    }, new Consumer<Throwable>() {
        @Override
        public void accept(Throwable throwable) {
            Timber.tag(TAG).e(throwable);
        }
    });
}