图像,你有一个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
}
它有哪些缺点?
1条答案
按热度按时间nqwrtyyt1#
GlobalScope是否合适取决于您的使用情形。如果使用GlobalScope,则由调用方在不再需要任务时手动取消该任务,以便它不会在不必要的情况下挂起资源和引用。
您当前的解决方案不是线程安全的,并且会在Dispatchers.Default中的任意线程上触发其回调。如果您使用的是Android,则可能需要在调用者用于调用您的函数的Looper上触发这些回调。
你真的需要回调函数吗?我会使用下面的回调函数,这样你就不用担心自己实现线程安全了。