Я правильно понимаю:
1. Запуск withContext(this.coroutineContext){ ... }
- это ничего не дает, выполнение кода без такой обертки абсолютно идентично выполнению с такой оберткой.
2. launch и async в случае работы в одном потоке запустят джоб не сразу, а вероятно после следующей точки остановки? А вот если диспатчер многопоточный - то launch и async запустятся сразу, параллельно (ну если будет свободный тред)
4. Если надо дождаться корутины launch/async - используем join/await соответственно. Эти методы идентичны по смыслу, просто второй вернет результат
4.1. join/await - блокируют исполнение кода (suspend) но не поток.
4.2. Если 4 верно, то зачем тогда launch-join? Был бы async-await, ну вернет он Unit и чего?
5. runBlocking { launch { } } - заблокирует поток то тех пор, пока launch не завершится. Т.к. внешний скоуп будет ждать всех дочерних. То есть это можно использовать для записи например в базу. В случае когда надо записать но данные потом не потребуются, можно использовать launch понимаю что если он завершится с ошибкой, то внешний try ее словит. Типа fire and forget но выполнения все же дождется.
6. withContext суспендит код пока не выполнит тело в другом контексте (вероятно обычно это используется для смены потока, для shared mutable state наверно. А для чего еще кроме смены потока?)
2 - нет. Запустят они его сразу. Порядок выполнения зависит от диспатчера. Вообще, хороший вопрос, что будет выполняться сначала. То, что внутри launch или то, что сразу за ним, но это на самом деле не важно, потому что порядок сохраняется внутри одной корутины, а launch порождает новую