我想在 Android
应用程序中自动查找设备。因此,我想进行两次调用,一次使用 Retrofit
进行网络调用,一次使用自定义 SDK 进行非网络调用,同时找出用户正在使用的设备。应用应选择第一个提供有效值的结果。
我使用 RxJava
并像这样使用运算符 amb
进行尝试:
public Observable<LoginResponse> detectDevice(String username, String pwd) {
return Observable.amb(device1.login(username, pwd), device2.login(username, pwd));
}
如果需要检测的设备是使用网络调用的设备 1,这似乎工作正常。但如果应该检测到的是 device2,它将返回 onError()
,因为 device1.login()
完成得更快并且 amb
需要第一个 onNext()
或 onError()
。即使 device2.login() 提供了有效结果,它也不会被考虑在内,因为它太慢了。
我的问题是:是否有更好的方法来只接受有效响应或其他运算符(operator)?我不想使用zip
,因为将来可能会有更多的设备,我不想让用户等到每个设备的登录请求都完成。
最佳答案
您可以尝试使用 materialise
来自 login
的任何输出的运算符功能,看看是否有错误,然后使用 takeUntil
运算符(operator)静默丢弃任何错误:
List<Observable<LoginResponse>> logins = new ArrayList<>();
logins.add(device1.login(username, pwd));
logins.add(device2.login(username, pwd));
Observable.from(logins)
.materialize()
.takeUntil((observableNotification) -> {
return !observableNotification.isOnError();
}).dematerialize();
一个改进是添加 timeout
如果没有来自任何 login
的回应抛出函数 Throwable
至 Subscriber
.
关于android - RxJava 运算符像 amb,但只有有效结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40087589/