【问题标题】:how to solve Unexpected return value in RxJava onSuccess() method?如何解决 RxJava onSuccess() 方法中的意外返回值?
【发布时间】:2020-05-12 11:17:45
【问题描述】:

我打算以此重构我的一种方法:

if (!isMobileBluetoothOn()) {
            sendError();
            return false;
        }

到这里

getBluetoothState().subscribe(state->{
            if(!state.isEnabled()){
                sendError();
                return false;
            }
        });

但我在 IDE "UnExpected return value" 中收到此错误,如何在 onSuccess 方法中返回布尔值?

【问题讨论】:

  • 使用map而不是subscribe ,你会得到Observable<Boolean>

标签: java android rx-java rx-android


【解决方案1】:

我建议您将这里的逻辑拆分为:

Observable<Boolean> isBluetoothEnabled = getBluetoothState()
    .map(state -> {state.isEnabled()})
    .replay(1)
    .refCount()
...
// use isBluetoothEnabled for something you need
...
isBluetoothEnabled
    .subscribe(isEnabled -> {
        if (!isEnabled) {
            sendError()
        }
    })

【讨论】:

  • 实际上我在一个返回类型为布尔值的方法中调用它,我想从 onSubscribed 方法返回该布尔值
  • @Reyjohn 这是不可能的 subscribe() 运算符仅返回 Subscription 对象(顺便说一句,您需要在某处取消订阅)。正如我在回答中提到的:您可以使用isBluetoothEnabled.map {...} 来获取此布尔值
【解决方案2】:

我真的不知道你的情况,但你说:

实际上,我在一个返回类型为布尔值的方法中调用它,我 想要从 onSubscribed 方法返回该布尔值

看起来您将同步获取布尔值。对于响应式编程来说,这绝对是不好的做法,但无论如何你都可以将Observable 用作BlockingObservable。代码如下所示:

val isEnabled = getBluetoothState().toBlocking().first().isEnabled()

您可以在此处阅读有关BlockingObservable 的更多信息:http://reactivex.io/RxJava/javadoc/rx/observables/BlockingObservable.html

尽量避免这种做法,但有时您必须使用它,而且可能就是您的情况。

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 2011-01-03
    相关资源
    最近更新 更多