Задать вопрос
@foonfyrick

CoroutineScope(Dispatchers.Main).launch{} vs CoroutineScope(Dispatchers.Main).launch(DispathersMain){}?

1. Я не совсем понимаю, зачем в конструкторе указывать имя корутины, ведь потом у нее нельзя указать поток выполнения, можно только у launch, а имя корутины показывается просто в логах.
val scope1 = CoroutineScope(CoroutineName("MyCoroutine"))
//либо так
           scope1.launch{}
//либо так
           scope1.launch(Dispatchers.Main){}

2. В чем разница, если я указываю в конструкторе корутины Dispatchers.Main или в конструкторе лаунчера?
val scope2 = CoroutineScope(Dispatchers.Main)
//либо так
           scope2.launch{}
//либо так
           scope2.launch(Dispatchers.Main){}

3. В чем разница CoroutineScope(Dispatchers.Main).launch{} vs CoroutineScope(Dispatchers.Main).launch(DispathersMain){}?
Я прочитал, что контекст указываемый в конструкторе CoroutineScope это место выполнения в соответствующем потоке(в мэйн потоке или в новом), а launch это сам запуск корутины, в которой, можно накидать еще кучу лаунчей, у каждого лаунча можно в конструкторе указать место выполнения, но, зачем тогда указывать место выполнения CoroutineScope? Я запутался.
  • Вопрос задан
  • 83 просмотра
Подписаться 1 Простой 2 комментария
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Kotlin
Android developer at Yandex
1) имя корутины нужно только для дебага

2) никакого конструктора лонча нет, это просто функция на CoroutineScope. Разницы между данными примерами нет. Передать диспатчер можно в случае, если ты хочешь лончить в другой диспатчер.

3) это вроде повтор второго вопроса. Разверну немного. Если в CoroutineScope передать диспатчер(D), то все лончи без дополнительных диспатчеров будут происходить на диспатчере D. A если не передавать, то все такие лончи будут происходить на Dispatchers.Default, то есть для андроида - на диспатчере, у которого несколько потоков, и на котором можно выполнять тяжёлые вычисления.
Лончи, в которые передан диспатчер, будут выполнены на этом диспатчере.

Как-то так. Это на самом деле сложная и запутанная тема. За внешней простотой скрывается очень сложная машинерия. Ты пока вскрыл довольно простые вещи.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@foonfyrick Автор вопроса
Ответ на первый вопрос нашел, контекст можно комбинровать вместе с именем через +
val scope1 = CoroutineScope(CoroutineName("MyCoroutine")+Dispatchers.IO)

два других под-вопроса пока что остаются не решенными
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы