Вложенная сопрограмма: тип диспетчера родительской сопрограммы - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь реализовать функцию Asyn c Task с помощью Coroutines. С помощью приведенного ниже фрагмента я могу достичь функциональности Asyn c Task.

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?,

  1. As Он поддерживается общим пулом потоков на JVM.
  2. Как есть родительский элемент 3 дочерних сопрограмм?
  3. Поскольку он является родительским элементом сопрограммы, имеющей Dispatchers.Main

Примечание. Исправьте меня, если мое понимание выше неверно.

Проблема area: Какой диспетчер подходит для родительского диспетчера?

1 Ответ

1 голос
/ 19 июня 2020

Я бы использовал Dispatchers.Main в качестве контекста для области сопрограммы:

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

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

        onPostExecute(result)
    }
}

В этом случае вам не нужно переключать контексты на Dispatchers.Main для функций onPreExecute и onPostExecute.

...