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));
}

如果需要检测的设备是使用网络调用的 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 的回应抛出函数 ThrowableSubscriber .

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

相关文章:

android - RecyclerView 使用 RxJava 无限滚动

android - 使用改造 ResponseBody 自定义消息错误

scala - 如何在 RxScala/Java 中使用多线程执行 map、filter、flatMap?

android - 支持 RxJava 的链式改造服务

android - 如何使用 RxJava 实现 NullObject 模式

java - 重试后不调用doOnCompleted

android - 如何忽略 AndroidManifest.xml 中的无效值?

java - 我可以在运行时将字符串数组保存到strings.xml吗?

android - Android Studio 中重命名包和重命名目录有什么不同?

scheduled-tasks - 使用 Observables 进行轮询的手动递归的更新版本是什么?