Ответ
Unconfined — это диспетчер, который запускает корутину в текущем потоке до первой точки приостановки, а затем продолжает её в потоке, который возобновляет работу.
Проблемы:
- Непредсказуемость потока — после
suspendкорутина может продолжиться в другом потоке, что усложняет отладку. - Риск блокировки UI — если начать в главном потоке и вызвать блокирующую операцию до первой точки приостановки, UI зависнет.
- Не рекомендуется для прода — подходит только для тестов или очень специфичных случаев.
Пример:
// Плохо: может блокировать UI или переключиться на другой поток
GlobalScope.launch(Dispatchers.Unconfined) {
doBlockingWork() // Опасно, если вызвано в Main-потоке!
withContext(Dispatchers.IO) { ... } // После suspend поток может измениться
}
Лучше использовать явные диспетчеры (Dispatchers.IO, Dispatchers.Default или Dispatchers.Main).