首页 > 解决方案 > android中的Kotlin Lazy Coroutine

问题描述

我正在尝试为我的协程创建惰性函数。我创建了这样的 util 函数。

fun <T> lazyCoroutine(scope: CoroutineScope, block: suspend CoroutineScope.() -> T): Lazy<T> {

    val some = scope.async(start = CoroutineStart.LAZY) {
        block.invoke(this)
    }
    return lazy {
        some.await()
    }
}

但在终端节目中

我的错误

我也不想回来Deferred<T>,我只想回来刚出来deferred。我看到大部分Deferred<T>不适合我的场景的文章返回。有没有相关的解决方案请指出。祝你有美好的一天!。

情景

标签: androidandroid-architecture-componentskotlin-coroutines

解决方案


我看到大部分Deferred<T>不适合我的场景的文章返回。

您还没有说清楚到底什么是不合适的Deferred,但是如果这await()是一个可暂停函数的事实,那么您似乎要求得到自相矛盾的结果:您希望用户调用一个不可暂停的函数,但是实现使用可暂停的,并且您希望整体结果是非阻塞的。再多的包装或调整都不会让您避免来自可暂停域之外的阻塞。

如果您想保留一个普通的、不可暂停的函数,那么根本不要使用协程,它们只是另一层复杂性,您的线程仍然会阻塞,直到值可用。

如果您可以使用可暂停功能,那么您应该接受Deferred

fun <T> CoroutineScope.lazyCoroutine(
        block: suspend CoroutineScope.() -> T
): Deferred<T> {
    return async(start = CoroutineStart.LAZY) { block() }
}

推荐阅读