android - 使用 rxjava2 测试直到成功
问题描述
使用 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);
}
});
}
谢谢!
解决方案
谢谢阿列克谢,你是对的。为什么要把事情复杂化?
最终结果如下所示:
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);
}
});
}
推荐阅读
- xml - XSLT 通过 id 查找节点并获取父节点的 id
- c++ - 在函数中返回无符号字符数组但不返回指针
- amazon-dynamodb - DynamoDB - 扫描后应用限制的最佳方法
- jenkins-pipeline - 在 Jenkins 管道脚本中找不到文件
- angular - Angular getRawValue() 不会从反应形式中获取 [values]
- sql-server - 求小数点后六位数值,不四舍五入
- unity3d - 为什么我的相机不显示项目,除非我将其移动到 2D 中的负 Z 位置
- react-native - Flex 在 facebook.io 和实际应用程序中的工作方式不同,React Native
- angular - View child/ 从父组件查看子组件到子组件
- mysql - Date_add 的休眠 createQuery()