Антоха Разраб c AI – Telegram
Антоха Разраб c AI
129 subscribers
30 photos
2 videos
42 links
Делаю продукты в соло с помощью AI. На работе Sr. Android Engineer

Канал БЕЗ рекламы
Download Telegram
Сравнение MutableState и MutableStateFlow
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
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 делает регулярные скриншоты, сравнивает их и отслеживает изменения экрана.
Разбираем использование 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
Разбираем библиотеку Immutable Collections в Kotlin:

👉 Почему стандартные коллекции 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
Разбираем, что происходит при нажатии кнопки "Старт" в 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
Channel name was changed to «Черновик Android Разраба»
Ну что ж, настало время попробовать сделать что-то в формате build in public. Обычно у меня в фоне есть проекты, которые я пилю сам, с помощью джунов или AI.

В этот раз идея простая: жена попросила сделать нормальный виджет погоды с 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
👍1
Антоха Разраб c AI
Ну что ж, настало время попробовать сделать что-то в формате build in public. Обычно у меня в фоне есть проекты, которые я пилю сам, с помощью джунов или AI. В этот раз идея простая: жена попросила сделать нормальный виджет погоды с UV-индексом на день. Оказалось…
Задумался, как мне из координат указанных пользователем вытащить ближайший город. Думал, может Places API или что еще - а нет, все проще. В Android есть Geocoder API, которое делает ровно сказанное выше и достаточно неплохо.
🔥3
Не с первого раза, да и на старом добром xml, вместо модного glance, но заставил вчера вечером Claude Code догенерировать мне черновик 3 виджетов.

Если бы не подписка, потратил бы баксов 30 на 3 виджета с обновлением данных. Норм?

#weather_app
🔥42💅2
Внутрянка пока что только так. Бесплатная OSM и геокодер о котором писал выше.

Мне подсветили что Geocoder апи может крашится в зависимости от вендоров, так что надо сразу firebase crashlytic прикручивать и искать замену

#weather_app
🔥4