Ответ
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 будет живой, и логика отработает. Всё просто, как три копейки. Не усложняй, и будет тебе счастье.