Android Broadcast
14.1K subscribers
3.47K photos
316 videos
11 files
5.78K links
Подборка новостей и статей для Android разработчиков.

Связь с автором @android_broadcast_bot
Реклама @android_broadcast_bot

РКН https://abdev.by/rkn_tg_ab
Download Telegram
Consuming flows safely in Jetpack Compose (5 мин)

В статье разбирается как подписываться на Flow из Compose с учетом ЖЦ в Android. Для этого служит новое API - collectAsStateWithLifecycle (доступно альфа версии Lifecycle 2.6.0), которое под капотом использует repeatOnLifecycle. Новое API рекомендуется на замену collectAsState в большинстве случаев.

#compose #coroutines
Forwarded from Kotlin Multiplatform Broadcast (Кирилл Розов)
Exploring "select" expression of Kotlin coroutines

select - это специальная функция, которая дожидается результата нескольких suspend функций и возвращает результат первой выполнившейся. В статье разбираются ее подробности и применение

В комментариях пишите примеры использования такой функции на практике

#coroutines
Forwarded from Kotlin Multiplatform Broadcast (Кирилл Розов)
Вышел Coil 2.6.0:
👉 Оптимизации для лучшей работы с Compose
🛠️ Исправление багов
👉 Kotlin 1.9.22 и обновление других зависимостей

#coroutines #library
Статья (EN, 8 мин) с разбором API для запуска Kotlin Coroutines в Android приложении в связке с жизненным циклом

🔗 Ссылка без VPN

#coroutines
Сравнение (EN,15м) выполнения операций в Android через Executor, RxJava, Coroutines и Flow. В тесте провели замер скорост через Jetpack Microbenchmark 3 операций:

Результат: Разные технологии не влияют для многопоточных IO операций. Выбор фреймворка лучше основывать на вашем удобстве. Простые задачи, как арифметика, лучше выполнять без многозадачности.

Как считаете вы?

#производительность #coroutines #rxjava
Довольно большой и подробный рассказ про остановку Coroutine в Kotlin. Рекомендую всем почитать, чтобы лучше понимать как отменить корутину и как это работает с CoroutineScope

#coroutines
Интересная статья (36м) с разбором как под капотом работают Kotlin Coroutine, что позволит вам развеять магию вокруг работы. Много полезного можете найти в канале автора @android_under_the_hood

#coroutines
Advanced Kotlin Coroutine Cheat sheet (EN, 8М) - статья для Android разработчиков по основным понятиям Kotlin Coroutines

#coroutines #android
Есть полезная Jetpack библиотека lifecycle-process, которая предоставляет Lifecycle, связанные с процессом вашего приложения (Application класс).

В статье(EN,7м) рассказывается как делают её интеграцию с корутинами и применяют в проекте

#jetpack #coroutines #lifecycle
Вышла библиотека 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
Please open Telegram to view this post
VIEW IN TELEGRAM
Разбор(4м) способов синхронизации доступа к переменной на примере инкремента int из разных корутин

#coroutines
🚀 Ускорение загрузки Koin при запуске Android приложения (EN,8м)

В Koin 4 добавили интеграцию с Jetpack Startup для запуска инициализации Koin

class MainApplication : Application(), KoinStartup {

override fun onKoinStartup(): KoinAppDeclaration = {
androidContext(this@MainApplication)
allowOverride(false)
modules(AppModule().module)
defaultModule()
}
}


и доступна инициализация фича модулей

// Initializer из Jetpack Startup
class FirstModuleInitializer : Initializer<Unit> {
override fun create(context: Context) {
loadKoinModules(firstModule)
}

override fun dependencies() =
mutableListOf(KoinInitializer::class.java)
}


Также показывается отложення загрузка модулей с помощью корутин

val m1 = lazyModule {
singleOf(::ClassA) { bind<IClassA>() }
}

startKoin {
// загрузка модулей в фоне с помощью Kotlin Coroutines
lazyModules(m1)
}

val koin = KoinPlatform.getKoin()

// Ожидания выполнения задач загрузки модулей
koin.waitAllStartJobs()

// или ставим в очередь лямбду на выполнение после
koin.runOnKoinStarted { koin ->
// Код выполнится после загрузки lazy modules
}


Подробнее про ленивые модули и фоновую загрузку в документации

#android #koin #di #jetpack #производительность #coroutines #AndroidBroadcast #БазаЗнаний
🏝 Как работает отмена Kotlin Coroutines под капотом (24м)

Подробная статья о том, что происходит при вызове функции cancel() - отмене корутине, а именно рассказывается про:
👉 Классы Job и JobSupport
👉 Состояния Job
👉 Как работает отмена в Structured Concurrency
👉 Коммуникация между родительской и дочерней Job
👉 Как отменяется функция delay()
👉 Как отменяются suspend функции

#kotlin #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
🏝 Управление событиями в ViewModel с помощью StateFlow, SharedFlow и Channel (6м)

В статье описывается, что выбрать StateFlow, SharedFlow или Channel для работы с событиями в ViewModel

#android #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
📹 Непростые вопросы про Kotlin Coroutines, Александр Гирев (40м)

Однажды пятничным вечером Александр и его коллега задумались над вопросом: где живут корутины, когда запустивший их coroutineScope героически погибает в жерновах GC? Субботнее утро было проведено за чтением статей и исходников.

Вот так и родилась идея доклада. В нем — ответы на вопросы об устройстве и работе корутин для самых любознательных.

📹 Версия на VK Video

#kotlin #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
🏝 Как правильно подписываться на данные для UI (EN,16м)

Очень классная статья от @nek_12_personal про лучшие практики для загрузки данных из UI, чтобы не выполнять лишнюю работу и не занимать ресурсы, когда UI не показывается

Чего следует избегать
1️⃣Ранняя загрузка данных в init блоке ViewModel
Запуск загрузки данных в блоке init может привести к устаревшей информации при возвращении пользователя к экрану после длительного отсутствия.

2️⃣Ручное управление обновлением данных из UI (например, вызовом в onResume)
Такой подход может вызвать множественные параллельные запросы, что увеличивает нагрузку на систему и усложняет управление состоянием.

3️⃣Постоянное наблюдение за потоками (Flow) без учёта жизненного цикла UI
Сбор данных в viewModelScope без учёта видимости UI может привести к утечкам памяти и избыточному потреблению ресурсов.

4️⃣Инициирование загрузки данных из UI-компонентов
Перенос логики загрузки данных в UI нарушает принцип разделения ответственности и усложняет архитектуру приложения.

Все подробности в статье, которую рекомендую вам изучить подробно!

🔗 Альтернативная ссылка

#kotlin #android #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
🤖 Как правильно конвертировать Flow в StateFlow

Для конвертации холодного Flow в горячий StateFlow для работы с состоянием (обычно происходит в ViewModel) стоит использовать оператор Flow<T>.stateIn(), с заданием политики запуска SharingStarted.WhileSubscribed
flow..stateIn(
scope = viewModelScope,
initialValue, // задаём начальное значение
started = SharingStarted.WhileSubscribed(
stopTimeoutMillis = 5.seconds,
replayExpirationMillis = 5.seconds,
),
)


SharingStarted.WhileSubscribed() — умный способ включать сбор данных только когда есть подписчики, и автоматически останавливать его, когда они исчезают. Важно настроить несколько значений:

👉 Параметр stopTimeoutMillis - задаем какое время пройдет после того как пропадет последний подписчик чтобы остановить StateFlow. По умолчанию стоит 0 мс, но Google рекомендует выставлять 5 секунд. Это позволит не останавливать Flow при пересоздании UI при смене конфигурации или если пользователь быстро свернул/развернул приложений.

👉 Параметр replayExpirationMillis - указывает через какое время после остановки сбросить кэш значений StateFlow и начать с начала, а именно initialValue

#kotlin #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
🏝 Stacktrace-decoroutinator поможет вам сделать стектрейс в вызовах корутин подробнее и понятным. Работает с JVM 1.8 и выше, а также на Android 14+

Самый простой способ подключения - через Gradle плагин

#kotlin #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM