如何将挂起函数转换为 RX Single(或 Completable)?

Ada*_*Kis 6 kotlin rx-java kotlin-coroutines rx-java3

我们正在将我们的项目从 RX 重构为 Kotlin 协程,但不是一次性完成的,因此我们需要我们的项目同时使用两者一段时间。

现在我们有很多像这样使用 RX single 作为返回类型的方法,因为它们是繁重、长时间运行的操作,例如 API 调用。

fun foo(): Single<String> // Heavy, long running opertation

我们希望它是这样的:

suspend fun foo(): String // The same heavy, long running opertation

当我们使用这种方法时,我们仍然希望使用 RX。

我们一直在这样做:

foo()
    .subscribeOn(Schedulers.io())
    .map { ... }
    .subscribe { ... }
Run Code Online (Sandbox Code Playgroud)

现在我应该如何将我的挂起乐趣转换为生成一个我可以使用的 Single?

这是一个好主意吗?

Single.fromCallable {
    runBlocking {
        foo() // This is now a suspend fun
    }
}
    .subscribeOn(Schedulers.io())
    .map { ... }
    .subscribe { ... }
Run Code Online (Sandbox Code Playgroud)

Ten*_*r04 15

我没有\xe2\x80\x99t 给它很多时间来推理它,但我认为你创建它的方式可能会在挂起函数期间使用一个额外的线程。

\n

有一个官方kotlinx-coroutines-rx3库可以进行转换。该rxSingle函数与此处相关。在幕后,它将以挂起方式调用挂起函数,而不会阻塞其他线程。

\n

我自己还没有使用过这个,所以你可能想自己测试一下,但我不认为你需要立即使用这个,因为subscribeOn实际的工作是在协程中完成的。你的挂起函数,因为它是一个挂起函数,如果它执行阻塞IO,那么它Foo应该已经在内部使用。Dispatchers.IO

\n
rxSingle { foo() }\n    .map { ... }\n    .subscribe { ... }\n
Run Code Online (Sandbox Code Playgroud)\n