首页 > 解决方案 > 使用 rxjava2 测试直到成功

问题描述

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

给定一个 ntp 服务器列表,测试每一个,直到成功。

例子:

我不想并行地测试所有东西,而是一个一个地测试。如果全部失败,它会再次重新开始测试。

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

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);
        }
    });
}

谢谢!

标签: androidrx-javarx-java2

解决方案


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

最终结果如下所示:

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);
        }
    });
}

推荐阅读