【问题标题】:RxJava2 - no event received with .blockingFirst()RxJava2 - .blockingFirst() 未收到任何事件
【发布时间】:2019-10-01 17:20:52
【问题描述】:

我正在尝试从我的 Observable (BehaviorSubject.create()) 中获取一个值

当我运行 locationObservable.subscribe {} 时,我会在几秒钟内收到结果。然而与

        try {
            it.locationObservable
                    .timeout(10, TimeUnit.SECONDS)
                    .blockingFirst()
        } catch (e: Exception) {
        }

无论有没有超时,都不会发生任何事情。我只是收到“java.util.concurrent.TimeoutException:源在 10 秒内没有发出事件信号并已终止”。我尝试过blockingFirst()、blockingLast() 和blockingForEach()。我是否以某种方式阻塞了可以为我提供价值的线程?

编辑:将其从主线程移出后,它开始工作。谢谢大家的意见。

【问题讨论】:

  • 您为什么一开始就尝试进行阻塞调用?一般来说,你应该避免使用 RxJava 阻塞。更多信息:stackoverflow.com/a/52662255/4409409
  • 您提供的示例中引用的 blockingGet() 适用于 Single,我正在使用 BehaviorSubject。我知道阻塞可能会破坏反应编程的目的,但在我的情况下,我需要在执行代码的其他部分之前从 Android 检索位置快照,并且我不希望每次需要快照时都有监听器.我知道阻塞线程的风险。

标签: java android rx-java rx-java2


【解决方案1】:

.observeOn(Schedulers.io()) 操作符会将所有已发射的项目排队等待在 Android 应用程序的 IO 线程中发射。

【讨论】:

  • 感谢您的建议。我刚刚用 .observeOn(Schedulers.io()) 尝试过,但仍然没有发出任何事件。
  • 试试这些 .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread())
  • 这也行不通。我也尝试过使用blockingSubscribe。
【解决方案2】:

尝试以下方法:

  .timeout(10, TimeUnit.SECONDS, Observable.just("fallback"))

【讨论】:

    猜你喜欢
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    相关资源
    最近更新 更多