Сравнение MutableState и MutableStateFlow
1. Область применения и варианты использования
MutableState
Область применения: в первую очередь предназначено для управления состоянием пользовательского интерфейса в компонуемых элементах в Jetpack Compose.
Вариант использования: этот подход лучше всего подходит для простого состояния, которое является локальным для отдельных компонуемых объектов, или когда состояние не нужно распределять между различными уровнями приложения.
MutableStateFlow
Область применения: универсальный держатель состояний, который является частью сопрограмм и библиотек потоков Kotlin, что делает его полезным на всех уровнях приложения.
Вариант использования: Идеально подходит для состояний, которые наблюдаются или совместно используются несколькими компонентами или уровнями приложения, например, в бизнес-логике или обработке данных.
2. Безопасность потоков и параллелизм
MutableState
Обновления необходимо выполнять в основном потоке, что требует тщательного управления потоками при взаимодействии с фоновыми задачами.
Отсутствие встроенной поддержки параллелизма может затруднить его использование в более сложных или многопоточных средах.
MutableStateFlow
По своей сути потокобезопасен и может безопасно обрабатывать обновления из любого потока.
Поддерживает параллельные операции и может комбинироваться с другими потоками, что делает его высокоэффективным для реактивного программирования в различных частях приложения.
3. Жизненный цикл и возможности потока
MutableState
Тесно связан со средой выполнения Compose, которая автоматически обрабатывает события жизненного цикла в пользовательском интерфейсе.
По своей сути не поддерживает потоковую передачу нескольких значений с течением времени, если это явно не управляется в компонуемых объектах.
MutableStateFlow
Учитывает жизненный цикл при использовании в таких областях, как viewModelScope, повышая его надежность при длительной эксплуатации.
Как поток, он естественным образом поддерживает отправку нескольких значений с течением времени, предоставляя надежное решение для динамических потоков данных.
4. Экспозиция «Только для чтения»
MutableState
Не поддерживает преобразование в состояние только для чтения напрямую. Если раскрыто, может быть приведено обратно к MutableState, что потенциально может привести к непреднамеренным мутациям.
MutableStateFlow
Его можно представить как StateFlow — интерфейс только для чтения, который предотвращает внешние мутации и соответствует лучшим практикам инкапсуляции.
1. Область применения и варианты использования
MutableState
Область применения: в первую очередь предназначено для управления состоянием пользовательского интерфейса в компонуемых элементах в Jetpack Compose.
Вариант использования: этот подход лучше всего подходит для простого состояния, которое является локальным для отдельных компонуемых объектов, или когда состояние не нужно распределять между различными уровнями приложения.
MutableStateFlow
Область применения: универсальный держатель состояний, который является частью сопрограмм и библиотек потоков Kotlin, что делает его полезным на всех уровнях приложения.
Вариант использования: Идеально подходит для состояний, которые наблюдаются или совместно используются несколькими компонентами или уровнями приложения, например, в бизнес-логике или обработке данных.
2. Безопасность потоков и параллелизм
MutableState
Обновления необходимо выполнять в основном потоке, что требует тщательного управления потоками при взаимодействии с фоновыми задачами.
Отсутствие встроенной поддержки параллелизма может затруднить его использование в более сложных или многопоточных средах.
MutableStateFlow
По своей сути потокобезопасен и может безопасно обрабатывать обновления из любого потока.
Поддерживает параллельные операции и может комбинироваться с другими потоками, что делает его высокоэффективным для реактивного программирования в различных частях приложения.
3. Жизненный цикл и возможности потока
MutableState
Тесно связан со средой выполнения Compose, которая автоматически обрабатывает события жизненного цикла в пользовательском интерфейсе.
По своей сути не поддерживает потоковую передачу нескольких значений с течением времени, если это явно не управляется в компонуемых объектах.
MutableStateFlow
Учитывает жизненный цикл при использовании в таких областях, как viewModelScope, повышая его надежность при длительной эксплуатации.
Как поток, он естественным образом поддерживает отправку нескольких значений с течением времени, предоставляя надежное решение для динамических потоков данных.
4. Экспозиция «Только для чтения»
MutableState
Не поддерживает преобразование в состояние только для чтения напрямую. Если раскрыто, может быть приведено обратно к MutableState, что потенциально может привести к непреднамеренным мутациям.
MutableStateFlow
Его можно представить как StateFlow — интерфейс только для чтения, который предотвращает внешние мутации и соответствует лучшим практикам инкапсуляции.
Статья объясняет, как реализовать систему предоплаченных платежей с использованием NFC (Near Field Communication) и меток NDEF (NFC Data Exchange Format) на устройствах Android. • Рассматриваются основы технологии NFC, структура сообщений NDEF и процесс чтения/записи данных на NFC-метки. • Автор предоставляет пошаговое руководство по созданию простой системы предоплаченных платежей, где NFC-метки выступают в роли "кошельков".
Ключевые компоненты:
NFC-адаптер: используется для взаимодействия с NFC-оборудованием.
PendingIntent: для обработки NFC-интентов в фоновом режиме.
IntentFilter: для фильтрации интентов, связанных с NFC.
NdefMessage и NdefRecord: для структурирования данных на NFC-метках.
Преимущества для Android-разработчиков:
Интеграция NFC: статья предоставляет практический пример интеграции технологии NFC в Android-приложения, что становится все более важным для бесконтактных взаимодействий.
Реальное применение: система предоплаченных платежей является наглядным примером использования технологии NFC в реальной жизни.
Понимание NDEF: разработчики могут узнать больше о работе с сообщениями и записями NDEF — основой обмена данными через NFC.
Безопасность: статья рассматривает аспекты безопасности NFC-транзакций, что важно для разработчиков, работающих с конфиденциальными данными.
Примеры кода: предоставленные фрагменты кода служат отправной точкой для реализации аналогичных функций.
Использование Android API: статья демонстрирует работу с различными Android API для NFC, помогая разработчикам освоить эти инструменты.
Пользовательский опыт: обсуждается создание удобного пользовательского интерфейса для работы с NFC, что важно для создания комфортных приложений.
https://proandroiddev.com/nfc-on-android-creating-a-prepaid-payment-system-using-ndef-tags-8105e46340b4
Ключевые компоненты:
NFC-адаптер: используется для взаимодействия с NFC-оборудованием.
PendingIntent: для обработки NFC-интентов в фоновом режиме.
IntentFilter: для фильтрации интентов, связанных с NFC.
NdefMessage и NdefRecord: для структурирования данных на NFC-метках.
Преимущества для Android-разработчиков:
Интеграция NFC: статья предоставляет практический пример интеграции технологии NFC в Android-приложения, что становится все более важным для бесконтактных взаимодействий.
Реальное применение: система предоплаченных платежей является наглядным примером использования технологии NFC в реальной жизни.
Понимание NDEF: разработчики могут узнать больше о работе с сообщениями и записями NDEF — основой обмена данными через NFC.
Безопасность: статья рассматривает аспекты безопасности NFC-транзакций, что важно для разработчиков, работающих с конфиденциальными данными.
Примеры кода: предоставленные фрагменты кода служат отправной точкой для реализации аналогичных функций.
Использование Android API: статья демонстрирует работу с различными Android API для NFC, помогая разработчикам освоить эти инструменты.
Пользовательский опыт: обсуждается создание удобного пользовательского интерфейса для работы с NFC, что важно для создания комфортных приложений.
https://proandroiddev.com/nfc-on-android-creating-a-prepaid-payment-system-using-ndef-tags-8105e46340b4
Demystifying Maestro’s UI Testing Implementation
Что такое Maestro?
Фреймворк для UI-тестирования Android, iOS и веб-приложений.
Использует YAML для описания команд.
Maestro Studio: веб-инструмент для генерации YAML-файлов, отображения дерева UI и запуска тестов.
Как работает Maestro?
Установка APK: CLI устанавливает собственные APK (test APK + инструментальный APK).
GRPC-сервер:
Запускается внутри инструментального APK через adb instrument.
Используется для взаимодействия между CLI и устройством.
UiAutomator:
Считывает иерархию UI (в формате XML).
Выполняет команды взаимодействия.
ADB: CLI также использует команды ADB для управления устройством.
Ожидание событий: CLI делает регулярные скриншоты, сравнивает их и отслеживает изменения экрана.
Что такое Maestro?
Фреймворк для UI-тестирования Android, iOS и веб-приложений.
Использует YAML для описания команд.
Maestro Studio: веб-инструмент для генерации YAML-файлов, отображения дерева UI и запуска тестов.
Как работает Maestro?
Установка APK: CLI устанавливает собственные APK (test APK + инструментальный APK).
GRPC-сервер:
Запускается внутри инструментального APK через adb instrument.
Используется для взаимодействия между CLI и устройством.
UiAutomator:
Считывает иерархию UI (в формате XML).
Выполняет команды взаимодействия.
ADB: CLI также использует команды ADB для управления устройством.
Ожидание событий: CLI делает регулярные скриншоты, сравнивает их и отслеживает изменения экрана.
https://android-developers.googleblog.com/2025/01/orientation-and-resizability-changes-in-android-16.html?m=1&s=31
Будет больно
(c) Черновик канала @droidgr
Будет больно
(c) Черновик канала @droidgr
Android Developers Blog
The future is adaptive: Changes to orientation and resizability APIs in Android 16
Build adaptive apps that support various screen sizes and orientations, promoting consistent user experiences across different Android devices.
Разбираем использование runBlocking в Android:
👉 Что такое runBlocking?
Функция, которая запускает новую корутину и блокирует текущий поток до её завершения.
Часто используется в примерах для демонстрации корутин в main() функции.
👉 Почему стоит быть осторожным с runBlocking в Android?
Блокирует текущий поток, что на Android может привести к замораживанию UI и возникновению ANR (Application Not Responding).
Особенно критично при выполнении операций ввода-вывода в главном потоке.
👉 Пример неправильного использования:
´´´
class MainViewModel(private val mainRepository: MainRepository) : ViewModel() {
// Не рекомендуется
private fun fetchPosters() = runBlocking {
mainRepository.fetchPosters()
}
}
´´
В этом примере runBlocking блокирует главный поток, что может привести к проблемам с отзывчивостью приложения.
👉 Рекомендуемые альтернативы:
Используйте viewModelScope для запуска корутин, что обеспечивает автоматическую отмену задач при уничтожении ViewModel.
Применяйте launch или async для асинхронных операций без блокировки главного потока.
(c) Черновик канала @droidgr
👉 Что такое runBlocking?
Функция, которая запускает новую корутину и блокирует текущий поток до её завершения.
Часто используется в примерах для демонстрации корутин в main() функции.
👉 Почему стоит быть осторожным с runBlocking в Android?
Блокирует текущий поток, что на Android может привести к замораживанию UI и возникновению ANR (Application Not Responding).
Особенно критично при выполнении операций ввода-вывода в главном потоке.
👉 Пример неправильного использования:
´´´
class MainViewModel(private val mainRepository: MainRepository) : ViewModel() {
// Не рекомендуется
private fun fetchPosters() = runBlocking {
mainRepository.fetchPosters()
}
}
´´
В этом примере runBlocking блокирует главный поток, что может привести к проблемам с отзывчивостью приложения.
👉 Рекомендуемые альтернативы:
Используйте viewModelScope для запуска корутин, что обеспечивает автоматическую отмену задач при уничтожении ViewModel.
Применяйте launch или async для асинхронных операций без блокировки главного потока.
(c) Черновик канала @droidgr
getstream.io
Exercise Caution When Using runBlocking on Android
Explore the internal mechanism of runBlocking and the reasons why you exercise caution when using runBlocking.
Разбираем библиотеку Immutable Collections в Kotlin:
👉 Почему стандартные коллекции Kotlin не всегда безопасны?
Стандартные коллекции (List, Set, Map) по умолчанию изменяемы, что может привести к непреднамеренным изменениям данных.
Даже коллекции, созданные с помощью listOf(), setOf(), mapOf(), являются только "только для чтения", но не по-настоящему неизменяемыми.
👉 Что предлагает библиотека Immutable Collections?
Предоставляет действительно неизменяемые коллекции, которые предотвращают случайные изменения и повышают безопасность в многопоточных средах.
Использует структурное разделение для оптимизации производительности и предотвращения ненужного копирования данных.
👉 Как начать использовать?
Добавьте зависимость в build.gradle.kts:
Создание неизменяемых коллекций:
Оригинальные immutableList и immutableMap остаются без изменений.
👉 Преимущества в Jetpack Compose:
Избежание ненужных рекомпозиций: Неизменяемые коллекции помогают Compose отслеживать изменения состояния и предотвращают избыточные обновления UI.
Стабильность состояния: Благодаря структурному разделению, изменения создают новые объекты, сохраняя неизменность предыдущих версий, что улучшает производительность.
Предсказуемое поведение UI: Исключение случайных мутаций данных обеспечивает более надежную работу интерфейса.
Подробнее о библиотеке Immutable Collections и её использовании читайте в статье:
#Kotlin #ImmutableCollections #JetpackCompose #AndroidDevelopment
(c) Черновик канала @droidgr
👉 Почему стандартные коллекции Kotlin не всегда безопасны?
Стандартные коллекции (List, Set, Map) по умолчанию изменяемы, что может привести к непреднамеренным изменениям данных.
Даже коллекции, созданные с помощью listOf(), setOf(), mapOf(), являются только "только для чтения", но не по-настоящему неизменяемыми.
👉 Что предлагает библиотека Immutable Collections?
Предоставляет действительно неизменяемые коллекции, которые предотвращают случайные изменения и повышают безопасность в многопоточных средах.
Использует структурное разделение для оптимизации производительности и предотвращения ненужного копирования данных.
👉 Как начать использовать?
Добавьте зависимость в build.gradle.kts:
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.5")
}
Создание неизменяемых коллекций:
import kotlinx.collections.immutable.*
val immutableList = persistentListOf("A", "B", "C")
val immutableSet = persistentSetOf(1, 2, 3)
val immutableMap = persistentMapOf("key1" to 100, "key2" to 200)
Добавление и удаление элементов:
kotlin
Копировать
Редактировать
val newList = immutableList.add("D") // Создает новый список
println(newList) // Вывод: [A, B, C, D]
val newMap = immutableMap.put("key3", 300)
println(newMap) // Вывод: {key1=100, key2=200, key3=300}
Оригинальные immutableList и immutableMap остаются без изменений.
👉 Преимущества в Jetpack Compose:
Избежание ненужных рекомпозиций: Неизменяемые коллекции помогают Compose отслеживать изменения состояния и предотвращают избыточные обновления UI.
Стабильность состояния: Благодаря структурному разделению, изменения создают новые объекты, сохраняя неизменность предыдущих версий, что улучшает производительность.
Предсказуемое поведение UI: Исключение случайных мутаций данных обеспечивает более надежную работу интерфейса.
Подробнее о библиотеке Immutable Collections и её использовании читайте в статье:
#Kotlin #ImmutableCollections #JetpackCompose #AndroidDevelopment
(c) Черновик канала @droidgr
Carrion.dev
Exploring Kotlin’s Immutable Collections Library
Exploring Kotlin’s Immutable Collections Library, use it in Compose to improve performance.
Разбираем, что происходит при нажатии кнопки "Старт" в Android Studio:
👉 Шаг 1: Сборка приложения
Команда: ./gradlew assembleDebug
Описание: Компилирует код и генерирует APK-файл в директории app/build/outputs/apk/debug/.
👉 Шаг 2: Запуск эмулятора
Команды:
emulator -list-avds
emulator -avd <имя_эмулятора>
Описание: Первая команда отображает список доступных виртуальных устройств, вторая запускает выбранный эмулятор.
👉 Шаг 3: Установка APK на устройство
Команда: adb install -r app/build/outputs/apk/debug/app-debug.apk
Описание: Устанавливает или переустанавливает APK на подключенное устройство или эмулятор.
👉 Шаг 4: Запуск приложения
Команда: adb shell am start -n <package_name>/<activity_name>
Описание: Запускает указанную Activity приложения на устройстве.
Эти команды позволяют управлять процессом сборки и запуска приложения напрямую из терминала, что особенно полезно для разработчиков, предпочитающих минималистичные среды разработки.
Подробнее о процессе читайте в статье:
#AndroidStudio #CommandLine #AndroidDevelopment
(c) Черновик канала @droidgr
👉 Шаг 1: Сборка приложения
Команда: ./gradlew assembleDebug
Описание: Компилирует код и генерирует APK-файл в директории app/build/outputs/apk/debug/.
👉 Шаг 2: Запуск эмулятора
Команды:
emulator -list-avds
emulator -avd <имя_эмулятора>
Описание: Первая команда отображает список доступных виртуальных устройств, вторая запускает выбранный эмулятор.
👉 Шаг 3: Установка APK на устройство
Команда: adb install -r app/build/outputs/apk/debug/app-debug.apk
Описание: Устанавливает или переустанавливает APK на подключенное устройство или эмулятор.
👉 Шаг 4: Запуск приложения
Команда: adb shell am start -n <package_name>/<activity_name>
Описание: Запускает указанную Activity приложения на устройстве.
Эти команды позволяют управлять процессом сборки и запуска приложения напрямую из терминала, что особенно полезно для разработчиков, предпочитающих минималистичные среды разработки.
Подробнее о процессе читайте в статье:
#AndroidStudio #CommandLine #AndroidDevelopment
(c) Черновик канала @droidgr
Medium
Behind the Scenes: What Happens When You Press the Start button in Android Studio?
As Android developers, we frequently rely on Android Studio’s “Run” or “Start” button to build, deploy, and launch our applications on…
Сделал небольшое саммари по AI для Android:
https://www.linkedin.com/feed/update/urn:li:activity:7379572553406730240/
https://www.linkedin.com/feed/update/urn:li:activity:7379572553406730240/
Linkedin
GitHub - mobile-next/mobile-mcp: Model Context Protocol Server for Mobile Automation and Scraping (iOS, Android, Emulators, Simulators…
AI for Android development. Here's what you need to know:
- Your dependency injection framework can now help you write the perfect prompt to solve crashes. Koin, a popular service locator for Kotlin, has introduced a new feature in its Kotzilla platform…
- Your dependency injection framework can now help you write the perfect prompt to solve crashes. Koin, a popular service locator for Kotlin, has introduced a new feature in its Kotzilla platform…
Ну что ж, настало время попробовать сделать что-то в формате build in public. Обычно у меня в фоне есть проекты, которые я пилю сам, с помощью джунов или AI.
В этот раз идея простая: жена попросила сделать нормальный виджет погоды с UV-индексом на день. Оказалось, что таких приложений на удивление мало, хотя, казалось бы, программ с погодой тьма.
Я слишком ленив, чтобы писать всё с нуля, поэтому попробую сделать это одним махом. План следующий:
👉 Взять обычный шаблон.
👉 Сгенерировать основу через Kiro.
👉 Сделать ревью кода.
👉 Докрутить с помощью Claude и руками.
Из плохих новостей: мой старый аккаунт разработчика снесли за то, что я забыл пройти верификацию в мае. Придётся создавать новый, чистый.
#weather_app
В этот раз идея простая: жена попросила сделать нормальный виджет погоды с UV-индексом на день. Оказалось, что таких приложений на удивление мало, хотя, казалось бы, программ с погодой тьма.
Я слишком ленив, чтобы писать всё с нуля, поэтому попробую сделать это одним махом. План следующий:
👉 Взять обычный шаблон.
👉 Сгенерировать основу через Kiro.
👉 Сделать ревью кода.
👉 Докрутить с помощью Claude и руками.
Из плохих новостей: мой старый аккаунт разработчика снесли за то, что я забыл пройти верификацию в мае. Придётся создавать новый, чистый.
#weather_app
😁2👍1
Антоха Разраб c AI
Ну что ж, настало время попробовать сделать что-то в формате build in public. Обычно у меня в фоне есть проекты, которые я пилю сам, с помощью джунов или AI. В этот раз идея простая: жена попросила сделать нормальный виджет погоды с UV-индексом на день. Оказалось…
Продолжаем #build_in_public. Немного технических деталей по будущему виджету
Откуда будем брать данные о погоде?
Open-Meteo (open-meteo.com). Это открытое и бесплатное API, что идеально подходит, пока проект некоммерческий. Никаких ключей и сложной регистрации.
Как будем определять локацию?
Тут всё просто:
📍 Автоматически определять ваше местоположение, чтобы сразу показать актуальный прогноз, стянув с gps
🗺 Если захочется посмотреть погоду в другом городе, можно будет выбрать точку вручную на карте. Для этого интегрируем OSM
Держим курс на простоту и функциональность!
#weather_app
Откуда будем брать данные о погоде?
Open-Meteo (open-meteo.com). Это открытое и бесплатное API, что идеально подходит, пока проект некоммерческий. Никаких ключей и сложной регистрации.
Как будем определять локацию?
Тут всё просто:
📍 Автоматически определять ваше местоположение, чтобы сразу показать актуальный прогноз, стянув с gps
🗺 Если захочется посмотреть погоду в другом городе, можно будет выбрать точку вручную на карте. Для этого интегрируем OSM
Держим курс на простоту и функциональность!
#weather_app
👍1
Антоха Разраб c AI
Ну что ж, настало время попробовать сделать что-то в формате build in public. Обычно у меня в фоне есть проекты, которые я пилю сам, с помощью джунов или AI. В этот раз идея простая: жена попросила сделать нормальный виджет погоды с UV-индексом на день. Оказалось…
Задумался, как мне из координат указанных пользователем вытащить ближайший город. Думал, может Places API или что еще - а нет, все проще. В Android есть Geocoder API, которое делает ровно сказанное выше и достаточно неплохо.
🔥3
Не с первого раза, да и на старом добром xml, вместо модного glance, но заставил вчера вечером Claude Code догенерировать мне черновик 3 виджетов.
Если бы не подписка, потратил бы баксов 30 на 3 виджета с обновлением данных. Норм?
#weather_app
Если бы не подписка, потратил бы баксов 30 на 3 виджета с обновлением данных. Норм?
#weather_app
🔥4❤2💅2