android - RxJava 运算符像 amb,但只有有效结果

标签 android rx-java rx-android

我想在 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 的回应抛出函数 ThrowableSubscriber .

关于android - RxJava 运算符像 amb,但只有有效结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40087589/

相关文章:

android - 未调用 PublishSubject doOnSubscribe

android - 重试获取数据 : rx. exceptions.MissingBackpressureException

android - Android中的iOS StackView相当于什么

android - KOIN 图重组时,委托(delegate)函数 viewmodel() 不刷新 viewmodel 实例

android - 接听电话或电话停止响铃时关闭 Android 上的自定义来电屏幕

java - 如何让 spring boot mvc 理解 observables?

java - 为什么我的服务器和客户端在服务器 Activity 开始时断开连接?

java - 出错后重启 BehaviorSubject

java - RxJava 条件中断链

android - 改造 "IllegalStateException: Already executed"