首页 > 解决方案 > 嵌套协程:父协程调度器的类型

问题描述

我正在尝试使用协程实现异步任务功能。使用下面的代码片段,我可以实现异步任务功能。

fun execute(vararg params: Params?) {
    job = CoroutineScope(Dispatchers.Default).launch {
        withContext(Dispatchers.Main) {
            onPreExecute()
        }

        withContext(Dispatchers.IO) {
            doInBackground(*params)
        }

        withContext(Dispatchers.Main) {
            onPostExecute(result)
        }
    }
}

我只担心在父协程上使用哪个调度程序。是 Dispatchers.Default(或)Dispatchers.IO。使用两个调度程序功能都可以正常工作。

使用 Dispatchers.IO 是否正确?

  1. 这是因为线程池中没有更多可用线程。
  2. Dispatchers.Default 可能存在延迟,因为它的线程有限。

使用 Dispatchers.Default 是否正确?

  1. 因为它由 JVM 上的共享线程池支持。
  2. 因为它是 3 个子协程的父级?
  3. 因为它是具有 Dispatchers.Main 的协程的父级

注意:纠正我,如果我的上述理解是错误的。

问题区域:什么是适合父调度器的调度器?

标签: androidkotlinkotlin-coroutineskotlin-android-extensionscoroutinescope

解决方案


我将用Dispatchers.Main作协程范围的上下文:

fun execute(vararg params: Params?) {
    job = CoroutineScope(Dispatchers.Main).launch {
        onPreExecute()

        val result = withContext(Dispatchers.IO) {
            doInBackground(*params)
        }

        onPostExecute(result)
    }
}

在这种情况下,您不需要将上下文切换到Dispatchers.MainforonPreExecuteonPostExecute函数。


推荐阅读