如何解决为什么必须在“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 举报,一经查实,本站将立刻删除。