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

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

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

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

0
Shanker 19 Июн 2020 в 12:24

1 ответ

Лучший ответ

Я бы использовал 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.

1
Sergey 19 Июн 2020 в 09:35