如何从Rx Java 中的单个可观测值返回值
fun fetchRunResult() : Single<Boolean>{
return Single.just(false)
}
fun canRun() : Boolean {
return person.fetchRunResult() // get boolean instead of Single
}
反应和非反应世界之间的转换通过以下方式完成:阻止呼叫或订阅
为什么使用反应式?
- 组成不带回调地狱的异步事件流
- 将系统设计为流
将反应型转换为非反应型:阻塞
fun canRun() : Boolean {
return person.fetchRunResult().blockingGet()
}
使用此方法,您可以只阻塞调用线程,直到有值可用为止。
阻塞调用线程有什么问题?
- 值可能永远不会到达,因此一个线程将永远被阻塞
- 如果被阻塞的线程是一个ui循环,则ui将被冻结,因为该线程正在CountDownLatch上等待阻塞(实现详细信息(
我应该在反应型和非反应型之间转换吗?
我建议谨慎使用。要么您知道源是同步的,要么您现在知道某个值已经可用。因此#blockingGet不会阻止调用线程
当源是异步的时,有什么替代方案?
对流进行建模,并在生命周期切换容器中使用#subscribe。例如,"活动"提供了生命周期方法。使用订阅时,调用/订阅线程不会被阻止。每当有新值可用时,您都会得到一个回调。这里唯一需要注意的是像在Disposable中一样清理资源,因为不这样做可能会导致反应类型的泄漏。
摘要:
- 如果您的数据是异步的,您的API应该反映这一点,而不是在响应<-><->之间切换无反应的
- 不要使用blockingGet possible,因为这可能会导致线程被永久阻塞