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 - 如何在不传入 Retrofit 实例的情况下使用 Retrofit 的 GsonConverter

php - 在Android中,当数据更改为数据库时如何显示消息?

android - 带有 Presenter 的 RxJava 和用于配置更改的保留 fragment

android - RxJava + 改造,获取列表并为每个项目添加额外信息

java - Android RxJava map 函数中的异步调用

android - RxJava 调用一次性 dispose()

android - Realm + RxJava + Android : Saving Realm object using RxJava in Android

java - 在Android Studio中编译时出现"not an enclosing class"错误

android - 在 CardView 包含的 RelativeLayout 上设置 onClickListener

android - 已达到数据库的已编译 sql 语句缓存的最大大小