我想在 Android
中自动查找设备应用程序。因此我想打两个电话,一个网络电话 Retrofit
和使用自定义SDK的非网络调用,同时找出用户正在使用的设备。应用程序应选择提供有效值的第一个结果。
我用 RxJava
并用运算符 amb
试了一下像这样:
public Observable<LoginResponse> detectDevice(String username, String pwd) {
return Observable.amb(device1.login(username, pwd), device2.login(username, pwd));
}
如果需要检测的设备是使用网络调用的 device1,这似乎可以正常工作。但是如果是 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/