【问题标题】:Kotlin coroutines in Android: Why use bg() from Anko instead of async()?Android 中的 Kotlin 协程:为什么使用 Anko 的 bg() 而不是 async()?
【发布时间】:2018-04-29 18:38:40
【问题描述】:

我今天开始在 Android 上使用 Kotlin 协程,我注意到 Anko 有一套自己的辅助方法。我理解为什么存在asReference(),但我不知道为什么存在bg(),因为核心协程库已经有async()。

bg() 代码非常简单,内部使用了async():

@PublishedApi
internal var POOL = newFixedThreadPoolContext(2 * Runtime.getRuntime().availableProcessors(), "bg")

inline fun <T> bg(crossinline block: () -> T): Deferred<T> = async(POOL) {
    block()
}

那么使用bg() 而不是async() 有什么好处呢? async() 对于 Android 应用程序在某种程度上是否效率低下?

【问题讨论】:

    标签: android kotlin kotlinx.coroutines anko


    【解决方案1】:

    如您所见,bg 使用POOL 作为其CoroutineDispatcher,请阅读here。

    基本上这个函数只存在于包装执行这些任务的池中。直接使用async 需要您提供一个。所以最后保证通过bg启动的每个任务都在同一个池中执行。

    【讨论】:

    • 感谢@s1m0nw1 的回答,不过async 不要求您提供池,这是可选的,它默认使用CommonPool,那么@ 的优势是什么? 987654330@ 使用不同的池?
    • 是的,但您无法控制CommonPool,对吧?也许POOL 需要以某种方式进行控制。这就是为什么他们定义了自己的池实例,用于bg
    • 既然你说“也许”,我认为这是你的猜测@s1m0nw1。我已经可以从代码中看到他们使用不同的池,我发布了这个问题,以便有人可以解释为什么会这样。再次感谢您的回答,但我需要更多关于是否有充分理由使用 bg 以及该理由是什么的具体信息。
    • 我和你差不多,也问过我的问题如果你想了解更多或者简单的回答,请随意:stackoverflow.com/questions/47461766/…
    猜你喜欢
    • 2017-12-01
    • 2018-08-17
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2017-02-01
    • 2016-07-05
    相关资源
    最近更新 更多