Как правильно реализовать приведенные ниже тесты с помощью 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);
}
});
}
Спасибо!
Спасибо, Алексей, ты прав. Зачем все усложнять?
Конечный результат выглядит так:
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);
}
});
}
Я думаю, что, поскольку вы хотите последовательно пробовать разные хосты, вам вообще не нужно использовать rxJava. Просто напишите цикл с несколькими connectAndGetTime () внутри.