Android Broadcast
14.2K subscribers
3.49K photos
334 videos
11 files
5.86K links
Подборка новостей и статей для Android разработчиков.

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

РКН https://abdev.by/rkn_tg_ab
Download Telegram
Forwarded from Kotlin Multiplatform Broadcast (Кирилл Розов)
Exploring "select" expression of Kotlin coroutines

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

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

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

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

🔗 Ссылка без VPN

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

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

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

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

#coroutines
🔥35👎2
This media is not supported in your browser
VIEW IN TELEGRAM
Почему стоит пробрасывать CancellationException в корутинах. Источник - Marcin Moskala

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

#coroutines
🔥32👍9👎43😐2😍1😡1
Advanced Kotlin Coroutine Cheat sheet (EN, 8М) - статья для Android разработчиков по основным понятиям Kotlin Coroutines

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

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

#jetpack #coroutines #lifecycle
👎116👍5
Вышла библиотека 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
👍28👎5
Разбор(4м) способов синхронизации доступа к переменной на примере инкремента int из разных корутин

#coroutines
🔥28👍14
🚀 Ускорение загрузки 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 #БазаЗнаний
1👍26🔥832
Как правильно работать с MutableStateFlow внутри ViewModel и из вне

Если вы пишите под Android и используете MVVM и корутины, то у вас будет подобный код

class YourViewModel() : ViewModel() {
val state = MutableStateFlow<State>(State.Initial)
}


По всем рекомендациям мы не должны давать наружу изменяемое состояние и все изменения должны делать только через методы. Самый простой вариант - указание отдельного публичного типа.

class YourViewModel() : ViewModel() {
private val _state = MutableStateFlow<State>(State.Initial)

val state: StateFlow<State>
get() = _state
}


В Kotlin есть возможность указать разного типа для свойства и его field, но пока доступна только как экспериментальная. Использовать её в продакшен коде на текущем этапе жизни не рекомендуется
С таким подходом мы закрыли через приведение типа на уровне свойства. Авторы Kotlin Coroutines позаботились о нас и сделали нашу жизнь проще с помощью функции asStateFlow(), который под капотом обернет MutableStateFlow в ReadonlyStateFlow и вернёт его как StateFlow. Применяя оператор мы получим следующий код:

class YourViewModel() : ViewModel() {
private val _state = MutableStateFlow<State>(State.Initial)

val state: StateFlow<State>
get() = _state.asStateFlow()
}


Каждое обращение к свойства state будет приводить к созданию новому экземпляру StateFlow, что является лишним, так как один StateFlow может иметь несколько коллекторов (подписчиков) на данные и никак не повлияет на работу, то можно сразу задавать свойство безе перегрузки get()

class YourViewModel() : ViewModel() {
private val _state = MutableStateFlow<State>(State.Initial)

// Создаем StateFlow, предназначенный для получения
// состояния из вне ViewModel
val state = _state.asStateFlow()
}


Больше подобных моих материалов и подборка интересных статей, книг, видео есть в
Базе Знаний Android разработчика

#android #kotlin #coroutines #jetpack #viewmodel #AndroidBroadcast #БазаЗнаний
👍7013🤯51
🏝 Как работает отмена Kotlin Coroutines под капотом (24м)

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

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

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

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

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

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

📹 Версия на VK Video

#kotlin #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
30👎6👍5
🏝 Как правильно подписываться на данные для 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
28👍12🤔12
🤖 Как правильно конвертировать 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
33👍20
🏝 Stacktrace-decoroutinator поможет вам сделать стектрейс в вызовах корутин подробнее и понятным. Работает с JVM 1.8 и выше, а также на Android 14+

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

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