Вышла библиотека KotlinX Coroutines 1.9.0
👩💻 Поддержка Wasm/WASI таргета
👉 limitedParallelism() позволяет задать имя Dispatcher для упрощения дебага. Также это стало стабильным API
👉 JVM. Dispatchers.IO больше не инициализируется при доступе к любому из стандартных Dispatcher
👉 Оператор Flow<T>.chunked(size: Int): Flow<List<T>>
❌ Еще больше deprecated API в BroadcastChannel
🛠 Исправление багов и улучшения
#coroutines #wasm #flow
👉 limitedParallelism() позволяет задать имя Dispatcher для упрощения дебага. Также это стало стабильным API
👉 JVM. Dispatchers.IO больше не инициализируется при доступе к любому из стандартных Dispatcher
👉 Оператор Flow<T>.chunked(size: Int): Flow<List<T>>
🛠 Исправление багов и улучшения
#coroutines #wasm #flow
Please open Telegram to view this post
VIEW IN TELEGRAM
Разбор(4м) способов синхронизации доступа к переменной на примере инкремента int из разных корутин
#coroutines
#coroutines
Рекомендую всем кто пользуется корутинами или недавно перешел на них, стоит почитать лучшие практики по их использованию. Они хоть и для Android, но есть много полезного что надо применять на любой платформе
#coroutines #kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
В рекомендациях пишут, что надо делать Inject диспатчеров, но не описывают как это сделать. Я реализую это с помощью собственного класса со всеми CoroutineDispatcher вместо того чтобы использовать квалификаторы для зависимостей в графе, например @Named()
#coroutines #di
#coroutines #di
Альтернативный вариант как делать inject CoroutineDispatcher в Dagger без дополнительного класса
#coroutines #di
#coroutines #di
Короткий разбор(EN,3м) как работает withContext() в Kotlin Coroutines и почему не стоит его активно использовать
#coroutines
#coroutines
В процессе дебага корутин вы могли столкнуться с тем что переменная "was optimized out", что является результатом оптимизиации state машины под капотом корутины.
Для того чтобы вся информация оставалась можно во время работы в IDEA включать debug режим работы Kotlin.
kotlin {
compilerOptions {
// Код запускается из IDEA/Android Studio
if (System.getProperty("idea.active") == "true"){
// Включаем режим дебага
freeCompilerArgs = listOf("-Xdebug")
}
}
}
#kotlin #idea #androidstudio #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
KotlinX Coroutines уже давно обзавелись своим BOM-ом, подключайте
#kotlin #gradle #coroutines
dependencies {
implementation(platform(libs.kotlinx.coroutines.bom))
implementation(libs.kotlinx.coroutines.core)
}
#kotlin #gradle #coroutines
Подробная статья о том, что происходит при вызове функции cancel() - отмене корутине, а именно рассказывается про:
👉 Классы Job и JobSupport
👉 Состояния Job
👉 Как работает отмена в Structured Concurrency
👉 Коммуникация между родительской и дочерней Job
👉 Как отменяется функция delay()
👉 Как отменяются suspend функции
#kotlin #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
😡 Перестаньте постоянно переключать потоки! (EN,7м)
Разработчика бомбануло что часто в коде видит постоянные переключения поток в корутинах! Написал статью, чтобы рассказать о том что этого делать не надо! Не буду рекомендовать, а ТРЕБУЮ к прочтению всеми разработчиками!
#kotlin #coroutines #concurrency
Разработчика бомбануло что часто в коде видит постоянные переключения поток в корутинах! Написал статью, чтобы рассказать о том что этого делать не надо! Не буду рекомендовать, а ТРЕБУЮ к прочтению всеми разработчиками!
#kotlin #coroutines #concurrency
Разбор Kotlin Coroutines Channels (EN, 13м)
👉 Что такое и зачем нужны
👉 Как устроены Channel
👉 Сравнение с Flow/SharedFlow
👉 Основные типы каналов
👉 Примеры использования
#kotlin #coroutines
👉 Что такое и зачем нужны
👉 Как устроены Channel
👉 Сравнение с Flow/SharedFlow
👉 Основные типы каналов
👉 Примеры использования
#kotlin #coroutines
Передавайте CoroutineContext вместо CoroutineDispatcher в конструкторы/функции (EN)
На примере различения поведения кода при использовании Dispatchers.Unconfined и EmptyCoroutineContext в статье показали, что принимать CoroutineDispatcher как параметр - не лучшая затея!
Dispatchers.Unconfined будет выполнять код на каком-то из потоков в рамках последнего использованного CoroutineDispatcher
#kotlin #coroutines
На примере различения поведения кода при использовании Dispatchers.Unconfined и EmptyCoroutineContext в статье показали, что принимать CoroutineDispatcher как параметр - не лучшая затея!
#kotlin #coroutines
Не стоит использовать CoroutineScope, отвязанный от приложения
Порой в коде встречается ситуация, когда для запуска корутины в репозитории или каком-либо менеджере разработчики создают CoroutineScope:
Но есть вариант хуже:
0️⃣ CoroutineScope не должен создаваться для запуска только одной корутины. ‼️
1️⃣ При создании
2️⃣ CoroutineScope должен быть связан с каким-либо жизненным циклом объекта. Вся суть scope заключается в том, чтобы отменять операции, когда они больше не нужны. Например, viewModelScope привязан к жизни ViewModel. В Android приложениях я всегда создаю Scope, связанный с Android Application классом, - AppScope. Либо использовать AppScope в классах, где нужен scope, либо сделать scope, который будет связан с другим CoroutineScope приложения.
Создать дочерний Scope можно следующим образом:
3️⃣ Вам точно нужен запуск корутины? Или подойдет suspend функция? Определитесь, почему асинхронный код должен работать независимо от вызывающего его кода и не иметь возможности получения информации об окончании работы через suspend. Также можно возвращать объект Job (хотя это спорная практика, на мой взгляд).
4️⃣ Не используйте ‼️ Это наследие старых корутин, когда ещё не было structured concurrency.
Что можете посоветовать вы авторам подобного кода, помимо почитать документацию и курсы? Пишите в комментариях.
#kotlin #coroutines
Порой в коде встречается ситуация, когда для запуска корутины в репозитории или каком-либо менеджере разработчики создают CoroutineScope:
class MyRepository(...) {
private val scope = CoroutineScope()
fun doWork(...) {
scope.launch { /* длительная работа */ }
}
}
Но есть вариант хуже:
class MyRepository(...) {
fun doWork(...) {
CoroutineScope(...).launch { /* длительная работа */ }
}
}
CoroutineScope
следует добавить Job (или SupervisorJob), а также CoroutineDispatcher
, который будет использоваться по умолчанию.Создать дочерний Scope можно следующим образом:
fun CoroutineScope.childScope(
context: CoroutineContext = EmptyCoroutineContext
): CoroutineScope {
return CoroutineScope(
coroutineContext
+ SupervisorJob(parent = coroutineContext[Job])
+ context
)
}
GlobalScope
. Что можете посоветовать вы авторам подобного кода, помимо почитать документацию и курсы? Пишите в комментариях.
#kotlin #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Android Broadcast
Однажды пятничным вечером Александр и его коллега задумались над вопросом: где живут корутины, когда запустивший их coroutineScope героически погибает в жерновах GC? Субботнее утро было проведено за чтением статей и исходников.
Вот так и родилась идея доклада. В нем — ответы на вопросы об устройстве и работе корутин для самых любознательных.
📹 Версия на VK Video
#kotlin #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
Отмена корутины не останавливает операцию мгновенно, а помечает корутину как "требующую остановки". Этот подход называется cooperative cancellation. Остановка корутины произойдет при вызове suspend-функции или проверке ее статуса через isActive. Специальное исключение CancellationException используется для уведомления всех связанных корутин о необходимости отмены.
Больше фактов об отмене корутины в статье🏝 Разбор как устроена отмена выполнения корутины (EN, 3 мин) или по альтернативной ссылке. Также полезно ознакомиться с официальной документацией.
#kotlin #coroutines
Больше фактов об отмене корутины в статье
#kotlin #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
Самый простой способ подключения - через Gradle плагин
#kotlin #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Dispatchers.Default
или Dispatchers.IO
Александр Таганов проделал крутую работу и его кейс позволит ускорить ваши приложения!
Также можно посмотреть на
00:00 - Про доклад
02:44 - Долгое ожидание простых операций
12:59 - Разбор причины долгих загрузок
21:30 - Выводы после анализа
24:35 - На что стоит заменить Dispatchers.Main
27:50 - Тестирование разных Dispatcher
#kotlin #coroutines #android
Please open Telegram to view this post
VIEW IN TELEGRAM