将Kotlin暂停函数转换为基于回调的函数

3lxsmp7m  于 2023-02-09  发布在  Kotlin
关注(0)|答案(1)|浏览(109)

图像,你有一个Kotlin暂停功能
suspend fun foo(): String { return "" }
我需要使它基于回调而不是挂起,即

interface Cancellable {
    fun cancel()
}

internal class CancellableImpl : Cancellable {
    var cancellationCallback: (() -> Unit)? = null

    override fun cancel() {
        cancellationCallback?.invoke()
    }
}

fun foo(callback: (String) -> Unit): Cancellable

GlobalScope方法是否有效?

fun foo(callback: (String) -> Unit): Cancellable {
        val task = CancellableImpl()

        val job = GlobalScope.launch {
            val fooResult = foo()
            callback(fooResult)
        }

        task.cancellationCallback = {
            job.cancel()
        }
        return task
}

它有哪些缺点?

nqwrtyyt

nqwrtyyt1#

GlobalScope是否合适取决于您的使用情形。如果使用GlobalScope,则由调用方在不再需要任务时手动取消该任务,以便它不会在不必要的情况下挂起资源和引用。
您当前的解决方案不是线程安全的,并且会在Dispatchers.Default中的任意线程上触发其回调。如果您使用的是Android,则可能需要在调用者用于调用您的函数的Looper上触发这些回调。
你真的需要回调函数吗?我会使用下面的回调函数,这样你就不用担心自己实现线程安全了。

GlobalScope.async { foo() }.asCompletableFuture()

相关问题