我有一个来自RxJava的Single,想继续使用一个来自Kotlin协程的Deferred。如何实现?
fun convert(data: rx.Single<String>): kotlinx.coroutines.Deferred<String> = ...
我会对一些库感兴趣(如果有库的话?),也会对自己做这个感兴趣......到目前为止,我自己做了这个手工实现:
private fun waitForRxJavaResult(resultSingle: Single<String>): String? {
var resultReceived = false
var result: String? = null
resultSingle.subscribe({
result = it
resultReceived = true
}, {
resultReceived = true
if (!(it is NoSuchElementException))
it.printStackTrace()
})
while (!resultReceived)
Thread.sleep(20)
return result
}
5条答案
按热度按时间lrl1mhuk1#
有一个集成了RxJava和协程的库:https://github.com/Kotlin/kotlinx.coroutines/tree/master/reactive/kotlinx-coroutines-rx2
但是在那个库中没有直接将single转换为
Deferred
的函数,原因可能是RxJavaSingle
没有绑定到协程作用域,如果你想将它转换为Deferred
,你需要提供一个CoroutineScope
。您可能会像这样实现它:
Single.await
函数(用于async
块)来自kotlinx-coroutines-rx 2库。您可以像这样调用函数:
bsxbgnwa2#
只需将您的单曲设置为暂停功能:
u4dcyp6a3#
并在代码中添加:
用法:
xqkwcwgp4#
这个怎么👇样
我尝试用
suspendCancellableCoroutine
块生成器将回调方面转换为协程!rslzwgfq5#
这将RxJava2 Single转换为带取消的暂停乐趣。