Android Broadcast
14.4K subscribers
3.68K photos
367 videos
11 files
6.1K links
Подборка новостей и статей для Android разработчиков.

Реклама и связь с автором @ab_manager

РКН https://abdev.by/rkn_tg_ab #MQRZR
Download Telegram
#Dagger #ArchitectureComponents #ViewModel

Assisted ViewModel

Как много усилий вы тратите на то чтобы написать ViewModelProvider.Factory для ViewModel из Architecture Components? Процесс не самый удобный, особенно когда в конструктор вы передаете только зависимости из графа . Dagger?

Я с коллегами решили написать библиотеку, которая избавит нас от этой тягомотины и поможет убрать необходимость реализации ViewModelProvider.Factory.

Пример использования:
class SampleViewModel @AssistedViewModel constructor(
repository:Repository
): ViewModel


class SampleFragment: Fragment {

private lateinit var viewModel: SampleViewModel

@Inject
// AssistedViewModelFactory is generated
fun init(factory: AssistedViewModelFactory) {
viewModel =
ViewModelProviders.of(this, factory)
.get(SampleViewModel::class.java)
}
}
#Room #SQLite #ArchitectureComponents

Вышел Room 2.1.0

Вышла новая версия Room в которой появились следующие возможности:
👉 Поддержка FTS
👉 Поддержка AutoValue
👉 Улучшена поддержка RxJava
👉 Поддержка Kotlin Coroutines (пока только suspend функции, ждем поддержки Channel и Flow)
👉 SQL view на основе аннотации @DatabaseView
👉 Исправление багов
#ArchitectureComponents #BestPractices

Распространенные ошибки при использовании Android Architecture Components

Повторение - мать учения. Поэтому рекомендую освежить или наоборот ознакомиться с рекомендациями по использованию Architecture Components:
1️⃣ Утечка LiveData Observer в Fragment
2️⃣ Повторная загрузка данных после смены конфигурации
3️⃣ Утечка ViewModel
4️⃣ Позволять View изменять LiveData
5️⃣ Создание зависимостей ViewModel после каждого изменения конфигурации
6️⃣ Хранение ссылки на View в ViewModel
#ArchitectureComponents, #DataBinding #Coroutines

ViewModels with Saved State, Jetpack Navigation, Data Binding and Coroutines

Architecture Components, представленные в 2017 году, значительно повлияли на разработку Android приложений. ViewModel используется в более чем 40% процентов приложений. За счет такой большой популярности это компонент все активнее и развивается и обрастает новыми функциями:
👉 Поддержка сохранения состояния в ViewModel
👉 Интеграция между Navigation библиотекой и ViewModel
👉 Использование ViewModel в DataBinding
👉 Поддержка Kotlin Coroutines в ViewModel на основе viewModelScope
#SQLite #Coroutines #Room #ArchitectureComponents

Threading models in Coroutines and Android SQLite API

В Room 2.1.0 появилась поддержка Coroutine, но особенность их работы в том, что они не гарантируют выполнение всей Coroutine в одном Java потоке. И тут получается проблема - SQLite требует выполнение транзакций в одном и том же потоке.

Как эту проблему решили разработчики Room? Для этого была создана специальная функции withTransaction, которая позволяет выполнять транзакции в БД с помощью Room на основе Coroutine.

В статье вы найдете подробности реализации транзакций SQLite при использовании Coroutine и как можно использовать CoroutineContext.
#Architecture #Modularization #ArchitectureComponents

Modularization by Feature and Layer with Android Architecture Components

Команда Android в последние 2 года активно стала решать трудности, связанные с разработкой эффективной архитектуры для Android приложений. Результат этого - Android Architecture Components.

Трендом текущей Android разработки является модуляризация. Она дает плюсы в архитектуре, более высокую скорость сборки проектов и возможность использовать Dynamic Features.

Как позволяет это реализовать текущий стек Architecture Components вы найдете в статье
#MVVM #AppArchitecture #ArchitectureComponents

Android MVVM — Do’s and Don’ts

Несколько рекомендаций при реализации архитектуры MVVM на основе Architecture Components:
👉 ViewModel не должна использовать классы из Android SDK. Используйте интерфейсы, которые позволят вам абстрагироваться от платформенной реализации.
👉 View не должна содержать какой либо логики (быть пассивной). Место для всей логики - это ViewModel.
👉 ViewModel не должна иметь ссылки на View
👉 Если вы хотите получать обновления данных от LiveData для обновления UI, тогда используйте viewLifecycleOwner.
#Architecture #ArchitectureComponents #AndroidX #MVVM

С появлением Architecture Components в Android реализация MVVM на основе этих компонентов стала очень популярна. Я и сам выбираю такое решение в связи с тем, что она имеет множество позитивных моментов:
👉 Решение популярных задач в архитектуре Android приложений
👉 Хорошая документация: статьи, видео, примеры и Codelab
👉 Интеграция с инструментарием для разработки
👉 Поддержка от Google
👉 Большинство разработчиков знают как ее реализовывать и это способ единообразен из-за одного источника правды (Google). Это уменьшает время на обучение стажеров и интеграцию новых людей + между проектами становится общий стандарт
👉 Интеграция между различными библиотеками из Architecture Component так и сторонними (RxJava, Kotlin Coroutines)

Я не считаю ее идеалом, но Arch Components значительно упрощают создание приложений на Android и дает взгляд на архитектуру приложений от создателя Android SDK.
#ArchitectureComponents #ViewModel #BestPractices

When to load data in ViewModels

Советы по загрузке данных в ViewModel:
Вызывать метод для загрузки данных
Запускать загрузку при создании ViewModel
Запускать загрузку данных отложено (lazy)
Загружать данные в LiveData, когда происходит вызов onActive()
Передавайте все необходимые данные в ViewModel через конструктор, а не функции или свойства
#SQLite #ArchitectureComponents #Room

Packing the Room: Pre-populate your database with this one method

Сейчас в разработке находится следующая версия (2.2) популярного ORM решения для Android - Room. В этой версии появляется функция предзаполнения, которая позволяет вам заполнить БД контентом из файла.

Это позволит избегать парсинга данных из файлов для заполнения данными и ускорить старт приложения.
#ArchitectureComponents

Android ProcessLifecycleOwner by example

Очень часто приходится сталкиваться с задачей по определению, когда приложение скрывается с экрана. Android Arсhitecture Components имеют ProcessLifecycleOwner. В статье рассматриваются подробности его работы и как его использовать
#ArchitectureComponents #LiveData

Unit-testing LiveData and other common observability problems

Важно помнить, что LiveData посылает обновления, только в том случае, когда у нее есть хотя бы один подписчик (observer). Это может привести к ошибкам в ваших тестах (успешно их прохождению или нет).

В статье рассматриваются ошибки и рекомендации по использованию LiveData в тестах:
👉 Используйте LiveData.getOrAwaitValue(timeout: Long) для получения результата из LiveData в unit тестах
👉 Используйте InstantTaskExecutorRule для предотвращения проблем с многопоточностью при работе с LiveData
👉 Частая ошибка - используйте один и тот же объект ViewModel, если он шарится между несколькими Fragment
#WorkManager #ArchitectureComponents

Workout your tasks with WorkManager — Advanced Topics

Продолжение серии статей о работе с WorkManager. В текущей рассматривается:
1️⃣ Как идентифицировать Task
2️⃣ Как получить статус Task
3️⃣ Политики по повторению выполнения Task (backoff)
4️⃣ Зависимости выполнения Task между собой
5️⃣ Как работать с входными и выходными данными
6️⃣ Как можно управлять многопоточностью в WorkManager
#ArchitectureComponents #Navigation #DynamicFeature

Navigation with Dynamic Feature Modules

Android Architecture Components - набор библиотек, который решил много проблем Android разработчиков и дал множество простых решений, одним из который является Navigation, который упрощает переходы между экранами в Android приложениях.

В свою очередь Google до сих пор не представила стабильного решения (пока есть только SNAPSHOT сборки) для навигации по приложению, когда вы используете Dynamic Delivery.

В статье описывается способ как с помощью Deep Link и Activity медиатора для обработки все таких ссылок достигается зен Navigation + Dynamic Delivery.
#Navigation #ArchitectureComponents #CustomTab

Add Chrome Custom Tabs to the Android Navigation Component

Architecture Components предоставило нам множество возможностей и библиотек, которые решили сложности работы с Android SDK. Одним из таких решений стало Navigation. Она позволяет вам эффективно описывать граф навигации, открывая Fragment, Activity, DialogFragment и deep link.

Как можно расширить и добавить новые типы Destination в графе? Библиотека также позволяет сделать и в статье вы найдете рецепт как сделать это.

Основы рецепта:
1️⃣ Создание собственного Destination
2️⃣ Создание собственного Navigator
3️⃣ Объявление кастомных атрибутов в XML (опционально)
4️⃣ Добавить поддержку нового Navigator в Navigation Host
#ArchitectureComponents #Architecture #Modularization

Android Components Architecture in a Modular Word

Хорошая статья в которой происходит разбор модуляризации Android приложения:
👉 Принципы осуществления модуляризации
👉 Модули и их роли
👉 Множество других полезный статей и примеров
👉 Проблемы со сторонними библиотеками
👉 Собственный пример
#Codelab #Coroutines #ArchitectureComponents

Advanced Coroutines with Kotlin Flow and LiveData
Продолжительность: 57 минут

В библиотеках ViewMode, Lifecycle и LiveData 2.2.0 было добавлена расширенная поддержка Kotlin Coroutines:
👉 Специальный билдер liveData {}, который внутри может выполнять suspend функции
👉 Конвертация Flow <-> LiveData
👉 Поддержка запуска Coroutine с Lifecycle и соответсвующие CoroutineScope в Fragment и Activity

В новой Codelab вы можете найти практическое занятие, которое поможет усвоить вам все аспекты нового функционала, а также расскажет о Flow, принципах работы с ними и его интеграции в ваши Android приложения для решения распространённых задач.

Почему стоит обратить внимание на Flow?
1️⃣ Это полностью нативный для Kotlin способ для работы с реактивными потоками данных
2️⃣ Он проще чем RxJava. Написать свой оператор намного проще
3️⃣ Flow быстрее RxJava и других существующих реализации Rx на Java/Kotlin (тесты есть в репозитории kotlinx.coroutines)