Rx Java单发射器的返回值

问题描述 投票:0回答:1

如何从Rx Java中的Single可观察值返回值

fun fetchRunResult() : Single<Boolean>{
   return Single.just(false)
}

fun canRun() : Boolean {
   return person.fetchRunResult() // get boolean instead of Single
}
java kotlin observable rx-java2
1个回答
1
投票

通过以下方式在反应式世界和非反应式世界之间进行转换:阻止通话或订阅

为什么使用反应式?

  • 组成没有回调地狱的异步事件流
  • 将系统设计为流

将反应类型转换为非反应类型:阻止

fun canRun() : Boolean {
    return person.fetchRunResult().blockingGet()
}

使用此方法,您可以阻塞调用线程,直到可用值为止。

阻塞调用线程有什么问题?

  • 值可能永远不会到达,因此一个线程将永远被阻塞
  • 如果被阻止的线程是一个ui循环,则您的UI将被冻结,因为该线程在CountDownLatch(实现细节)上正在等待被阻止]

我应该在反应型和非反应型之间转换吗?

我建议仅谨慎使用它。您可能已经知道源已同步,或者现在您已经知道一个值已经可用。因此,#blockingGet不会阻止调用线程

当源异步时,有什么替代方法?

对流进行建模,并在生命周期处理容器中使用#subscribe。例如,活动提供生命周期方法。使用订阅时,将不会阻止调用/订阅线程。每当有新值可用时,您都会得到一个回调。这里唯一要注意的是像Disposable中那样清理资源,因为不这样做可能会导致反应型泄漏。

摘要:

  • 如果您的数据是异步的,则您的API应该反映出来,并且不要在反应式非反应式之间切换>
  • 请不要使用blockingGet,因为这可能会导致一个线程,该线程将被永久阻止
© www.soinside.com 2019 - 2024. All rights reserved.