使用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);
}
});
}
谢谢!
答案 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);
}
});
}