В каком потоке запускается LaunchedEffect

Ответ

LaunchedEffect запускается в корутине, привязанной к области видимости (CoroutineScope) композиции. По умолчанию это Dispatchers.Main, так как Compose работает в UI-потоке. Однако внутри блока можно переключать контекст с помощью withContext.

LaunchedEffect(key) {
    // По умолчанию - Main
    withContext(Dispatchers.IO) {
        // Работа в IO-потоке
    }
}

Важно: не выполняйте долгие операции напрямую в LaunchedEffect без смены диспетчера, чтобы не блокировать UI.

Ответ 18+ 🔞

А, слушай, вот этот ваш LaunchedEffect — штука мощная, но с ней надо аккуратно, а то можно такую дичь устроить, что потом волосы дыбом встанут.

Представь себе: ты его запускаешь, а он, сука, по умолчанию влезает в главный UI-поток, как будто так и надо. Ну, логично — Compose-то в нём и работает, ёпта. Но вся соль в том, что если ты внутри начнёшь какую-нибудь тяжёлую операцию прямо так, без спросу — это будет пиздец, Карл. UI просто встанет колом, как вкопанный, пользователь будет тыкать в экран, а ему в ответ — хуй с горы. Доверия ебать ноль после такого.

Весь фокус в том, что ты должен явно сказать системе: "Э, погоди, дружок, эту поеботу — в другой поток". Для этого у нас есть withContext. Внутри блока LaunchedEffect ты спокойно так переключаешься, например, на Dispatchers.IO, и уже там делаешь всю свою грязную работу: файлы качай, сетевые запросы гоняй, в базу данных лезь — делай что хочешь.

LaunchedEffect(key) {
    // Тут ты пока ещё в главном потоке, не делай резких движений
    withContext(Dispatchers.IO) {
        // А вот тут уже можно! Работай в IO-потоке, не стесняйся
    }
}

Главное правило — мозги набекрень не включай. Если ты видишь, что операция может подвиснуть больше чем на пару миллисекунд — сразу выноси её из Main. Иначе получится классическая история: приложение вроде бы и запустилось, а интерфейс не реагирует, и пользователь уже чувствует подозрение ебать. Он думает: "Что за манда с ушами, опять зависло?"

Запомни раз и навсегда: LaunchedEffect — это не место для раздумий о смысле жизни. Это триггер, который говорит: "Чувак, ключ поменялся, пора делать дело". А само "дело", если оно тяжёлое, — делай в сторонке, в отдельном потоке. Так и UI будет живой, и логика отработает. Всё просто, как три копейки. Не усложняй, и будет тебе счастье.