微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么必须在“single”之前调用“toBlocking”?

如何解决为什么必须在“single”之前调用“toBlocking”?

我正在探索 Swagger 生成的 Java API。在生成的客户端文件中,我看到两种方法是这样的:

public Observable<UserAccountView> createuserAccount(/* params omitted  */) {
   /* body omitted */
}

public UserAccountView createuserAccountSynchronously(/* params omitted */) {
  return createuserAccount(/*params*/).toBlocking.single();
}

我已经阅读了 RxJava 文档和相关资源,但由于我是新手,我仍然发现自己认为 toBlocking 不应该在这里需要 - 阻塞/非阻塞不会失去意义单身?有没有阻塞 Single 之类的东西?

显然我没有完全掌握这两种方法间的关系。我认为 single() 在取消订阅之前从 observable 中提取单个事件。为什么需要 toBlocking 才能做到这一点?

解决方法

存在 toBlocking() 调用,因此该方法返回 UserAccountView 而不是 Observable<UserAccountView>toBlocking()Observable 转换为 BlockingObservable,调用 BlockingObservable.single() 返回 BlockingObservable 发出的任何项目,只要它在完成之前只发出一项(多于或少于一个会导致发出错误)。

如果在 RxJava1 中调用 Observable.single() 而不将其转换为 BlockingObservable,如果 Observable 在发出一项后完成,它将返回一个只发出一项的 Observable<UserAccountView> .在 RxJava2 中,此 API 得到改进,因此等效运算符 Observable.singleOrError() 返回 Single<UserAccountView>

阻塞/非阻塞不会失去 Single 的含义(或者在这种情况下,Observable 只会发出一个项目)。根据您设置调度程序的方式(例如使用 subscribeOn()observeOn() 或使用 Scheduler 的运算符),您可以有一个 Single/{{1在某个工作线程中进行处理后,它只异步发出它的一项。因此,如果 Observable 的调用者在应用程序的主线程中运行,则 createUserAccount() 可以立即返回,并在几秒钟后在工作线程上向下游发出其结果,而主线程永远不会被阻止。另一方面,使用 Observable<UserAccountView> 将阻塞主线程,直到 createUserAccountSynchronously() 发出它的一个项目。

通常在反应式应用程序中,您会避免使用 Observable<UserAccountView>,但有时您需要在反应式世界和非反应式阻塞世界之间架起一座桥梁,而这正是 toBlocking() 有用的地方。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。