Личного из моего опыт, часто приходится сталкиватся с тем, что операторы для #LiveData нужны. Не столько много как для Rx, и не такие сложные, но все таки это позволяет упрощать жизнь. В таком случае я рекомендую обратить внимание на библиотеку "Lives".
Эта библиотека содержит все в себе множество операторов (около 20 штук), которыми часто пользуются в Rx и они легкие:
filter() - эмитирует только те значения, которые удовлетворяют предикату
https://github.com/adibfara/Lives
Эта библиотека содержит все в себе множество операторов (около 20 штук), которыми часто пользуются в Rx и они легкие:
filter() - эмитирует только те значения, которые удовлетворяют предикату
val origLiveData = MutableLiveData<Int>()nonNull() - Возвращает NonNullLiveData, которая эмитирует только не null значения
val newLiveData = origLiveData.filter { it > 2 }
https://github.com/adibfara/Lives
GitHub
GitHub - adibfara/Lives: Lives - Android LiveData Extensions for Kotlin and Java
Lives - Android LiveData Extensions for Kotlin and Java - adibfara/Lives
#ProjectTreble - очень хорошая инициатива от Google, представленная на #GoogleIO17, которая позволяет упростить обновление устройств, отделив Android Framework on реализации Vendora: драйверов, работы с новыми датчиками и пр. Применение такого подхода стало обязательным для всех устройств, которые выпускаются с Android O и более новыми версиями ОС.
https://android-developers.googleblog.com/2017/05/here-comes-treble-modular-base-for.html
В рамках #AndroidDevSummit18 показали преимущества Project Treble - #GenericSystemImage (GSI). Технология позволяет вам запустить голый Android, не дожидаясь обновления от производителя. Производители устройств используют GCI (который строится на последних исходниках #AOSP) для проверки реализации интерфейса производителя на их устройствах.
Это дает разработчикам возможность на чистой версии Android на основе AOSP на любом Treble совместимом устройстве.
https://android-developers.googleblog.com/2017/05/here-comes-treble-modular-base-for.html
В рамках #AndroidDevSummit18 показали преимущества Project Treble - #GenericSystemImage (GSI). Технология позволяет вам запустить голый Android, не дожидаясь обновления от производителя. Производители устройств используют GCI (который строится на последних исходниках #AOSP) для проверки реализации интерфейса производителя на их устройствах.
Это дает разработчикам возможность на чистой версии Android на основе AOSP на любом Treble совместимом устройстве.
#Firebase #Predictions
Firebase - это прекрасный набор сервисов для создания мобильных приложений. Теперь в релиз вышел ещё один из них Predictions.
Этот сервис позволяет на основе машинного обучения сегментирование пользователей на основе их будущего поведения. В итоге полученные группы могут использоваться для таргетированная #RemoteConfig, #CloudMessaging, #InAppMessaging и A/B Testing.
Релиз Predictions также добавил новых функций:
* Prediction Health - позволяет понять насколько точным является предсказание поведения, смотреть информацию о сегментах и на основе каких данных они были созданы
* Export to BigQuery
Подробности в статье
"Predictions graduates to general availability to provide smarter user segmentation"
Firebase - это прекрасный набор сервисов для создания мобильных приложений. Теперь в релиз вышел ещё один из них Predictions.
Этот сервис позволяет на основе машинного обучения сегментирование пользователей на основе их будущего поведения. В итоге полученные группы могут использоваться для таргетированная #RemoteConfig, #CloudMessaging, #InAppMessaging и A/B Testing.
Релиз Predictions также добавил новых функций:
* Prediction Health - позволяет понять насколько точным является предсказание поведения, смотреть информацию о сегментах и на основе каких данных они были созданы
* Export to BigQuery
Подробности в статье
"Predictions graduates to general availability to provide smarter user segmentation"
The Firebase Blog
Predictions graduates to general availability to provide smarter user segmentation
Last year at Firebase Summit, we introduced you to Predictions, a machine learning product that helps you smartly segment your users based on their predicted future behavior. Without requiring anyone on your app team to have ML expertise, Predictions gives…
Замечательный парень Jake Warton, сделавший для Android сообщества множества полезных вещей, и я уверен, что библиотека в разработке которой он принимал участие есть в 99% проектов на Android.
Выступил с замечательным докладом на Droidcon London и рассказал о том, как сделать вашу жизнь с #Dagger лучше.
Выступил с замечательным докладом на Droidcon London и рассказал о том, как сделать вашу жизнь с #Dagger лучше.
#AssistedInjection
Позволяет эффективно передавать параметры в ваши зависимости. Например, когда у вас есть Presenter, ViewModel и пр в которую вам надо передать id данных, отображаемых на текущем экране. В чистом Dagger это делается через костыли, описываемое решение позваоляет избавиться от Subcomponent, lateinit и пр. в пользу генерируемых Factory.
https://github.com/square/AssistedInject
Позволяет эффективно передавать параметры в ваши зависимости. Например, когда у вас есть Presenter, ViewModel и пр в которую вам надо передать id данных, отображаемых на текущем экране. В чистом Dagger это делается через костыли, описываемое решение позваоляет избавиться от Subcomponent, lateinit и пр. в пользу генерируемых Factory.
https://github.com/square/AssistedInject
GitHub
GitHub - cashapp/InflationInject: Constructor-inject views during XML layout inflation
Constructor-inject views during XML layout inflation - cashapp/InflationInject
не смущайтесь версии 0.3.0. Jake не готов сделать ее 1.0 из-за пустяков. Она полностью стабильно по его заявлению.
#InflateInjection
Аналогично AssistedInjection, но предназначено для передачи зависимостей напрямую в конструктор View и работает на основе LayoutInflater.Factory.
Аналогично AssistedInjection, но предназначено для передачи зависимостей напрямую в конструктор View и работает на основе LayoutInflater.Factory.
#Dagger #Performance #Gradle
Dagger 2 сделал много полезного
* Избавил нас от рефлексии в Runtime, добавив вместо этого annotation processing во время сборки. Одна из больших проблем, что не было возможности его инкремтной сборки до Gradle 4.7.
* Сделал сгенерированный код читабельным, чтобы он был проще для понимания человеку.
К сожалению, за все это пришлось заплатить временем сборки проекта, но есть способ это исправить:
* Первое что надо сделать - обновиться до последней версии Dagger (на сегодня 2.19) и Gradle (4.10.2).
* Используя икрементальный режим annotation processor в Dagger 2
* Отключить форматирование генерируемого кода (это занимает около 40% времени работы annotation processor Dagger).
build.gradle
Dagger 2 сделал много полезного
* Избавил нас от рефлексии в Runtime, добавив вместо этого annotation processing во время сборки. Одна из больших проблем, что не было возможности его инкремтной сборки до Gradle 4.7.
* Сделал сгенерированный код читабельным, чтобы он был проще для понимания человеку.
К сожалению, за все это пришлось заплатить временем сборки проекта, но есть способ это исправить:
* Первое что надо сделать - обновиться до последней версии Dagger (на сегодня 2.19) и Gradle (4.10.2).
* Используя икрементальный режим annotation processor в Dagger 2
* Отключить форматирование генерируемого кода (это занимает около 40% времени работы annotation processor Dagger).
build.gradle
tasks.withType(JavaCompile).configureEach {
options.compilerArgs += [
"-Adagger.formatGeneratedSource=disabled",
"-Adagger.gradle.incremental=enabled"
]
}
// Для проектов с Kotlin где используется kapt
kapt {
arguments {
arg("dagger.formatGeneratedSource", "disabled")
arg("dagger.gradle.incremental", "enabled")
}
}Отключение форматирования сгенерированного кода стоит делать только при разработке. Публиковать приложения рекомендуется с отформатированным кодов, иначе у вас могут быть проблемы с понимаем кода из стек трейсов.
Обратите внимание на режим "fastInit" который может позволить вам ускорить инициализацию вашего графа при старте приложения, тем самым ускорив появление первого экрана
#OkHttp #LibUpdates
Вышел OkHttp 3.12. Основные измнения:
* Поддержка TLS 1.3
* Proxy authenticators теперь запрашивает preemptive authentication
* Поддержка таймаута полной операции
Появилась возможность таймаут всей операции, включая поиск DNS, подключение, запись тела запроса, обработка запроса сервером и считывание ответа.
Используйте
* Небольшие улучшения различных API
* Исправление багов
https://github.com/square/okhttp/blob/master/CHANGELOG.md#version-3120
Вышел OkHttp 3.12. Основные измнения:
* Поддержка TLS 1.3
* Proxy authenticators теперь запрашивает preemptive authentication
* Поддержка таймаута полной операции
Появилась возможность таймаут всей операции, включая поиск DNS, подключение, запись тела запроса, обработка запроса сервером и считывание ответа.
Используйте
OkHttpClient.Builder.callTimeout() или Call.timeout() для задания ограничения.* Небольшие улучшения различных API
* Исправление багов
https://github.com/square/okhttp/blob/master/CHANGELOG.md#version-3120
Перешли ли вы на AndroidX в своих проектах?
public poll
Да – 11
👍👍👍👍👍👍👍 48%
@artnester, @mikshka, @Belogurow, @pavel_bp, @Helpa, @ch13mob, Dzmitry, @koren_ivan, Ihor, @k_sergeevich, @PavelSha
Жду обновления сторонних библиотек – 10
👍👍👍👍👍👍 43%
@katso, @OlegTarashkevich, @alexey_zubkovskiy, @vla3089, @MikeKr1, @lumiandrey, @Dartlen, @krlrozov, @andorke, @ArtemBagritsevich
Что это такое? – 2
👍 9%
Anatole, @Ant1skilla
👥 23 people voted so far. Poll closed.
public poll
Да – 11
👍👍👍👍👍👍👍 48%
@artnester, @mikshka, @Belogurow, @pavel_bp, @Helpa, @ch13mob, Dzmitry, @koren_ivan, Ihor, @k_sergeevich, @PavelSha
Жду обновления сторонних библиотек – 10
👍👍👍👍👍👍 43%
@katso, @OlegTarashkevich, @alexey_zubkovskiy, @vla3089, @MikeKr1, @lumiandrey, @Dartlen, @krlrozov, @andorke, @ArtemBagritsevich
Что это такое? – 2
👍 9%
Anatole, @Ant1skilla
👥 23 people voted so far. Poll closed.
#Dagger #AndroidX #Fragment
Преимущественный способ доставки зависимостей в объекты является конструктор. Это позволяет гарантировать, что при создание объекта у вас есть все необходимое для его работы. К сожалению, стандартные компоненты Android системы (Activity, Fragment, Service и пр.) должны создаваться с помощью конструктора по умолчанию (без параметров) и это рушит описаный выше принцип. Например, Fragment создается сейчас так:
Пример того как реализовать FragmentFactory с Dagger 2 на основе Multibindings:
https://gist.github.com/kirich1409/45dc22004246c7a9fa7c1ef282c72fbe
Преимущественный способ доставки зависимостей в объекты является конструктор. Это позволяет гарантировать, что при создание объекта у вас есть все необходимое для его работы. К сожалению, стандартные компоненты Android системы (Activity, Fragment, Service и пр.) должны создаваться с помощью конструктора по умолчанию (без параметров) и это рушит описаный выше принцип. Например, Fragment создается сейчас так:
class MainFragment : Fragment() {
@Inject
lateinit var sampleDep: SampleDependency
override fun onAttach(context: Context) {
super.onAttach(context)
// Делаеv inject зависимостей
}
}
Проблема этого решения состоит в том, что sampleDep используется только внутри MainFragment и должна инициализировать только один раз. Было бы хорошо сделать так, чтобы sampleDep была приватной и немодифицируемой, например это выглядело бы так:class MainFragment @Inject constructor(
private val dependency: SampleDependency
) : Fragment()
Есть изящное решение для Fragment, которое появилось в androidx.fragment версии 1.1.0 - FragmentFactory. Это позволит вам кастомизировать создание Fragment. Android команда снова показала почему AndroidX заслуживает миграции на нее.Пример того как реализовать FragmentFactory с Dagger 2 на основе Multibindings:
https://gist.github.com/kirich1409/45dc22004246c7a9fa7c1ef282c72fbe
То что я описал для Fragment можно сделать и для всех стандартных компонентов приложения с помощью AppComponentFactory. единственное огорчение - чтобы это можно было сделать у вашего приложения должно быть minSdk=28.
Остается дождаться этак года 2023, чтобы начать это использовать все приложения тотально стали писаться на Android P+. 😁
Остается дождаться этак года 2023, чтобы начать это использовать все приложения тотально стали писаться на Android P+. 😁
#Kotlin #Coroutines #Concurrency
В продолжение своей серии статей о concurrency и корутинах Роман Елизаров поведывает о том как ситанксис Kotlin позволяет явно писать асинхронный вызовы и управлять ими
https://medium.com/@elizarov/explicit-concurrency-67a8e8fd9b25
В продолжение своей серии статей о concurrency и корутинах Роман Елизаров поведывает о том как ситанксис Kotlin позволяет явно писать асинхронный вызовы и управлять ими
https://medium.com/@elizarov/explicit-concurrency-67a8e8fd9b25
Medium
Explicit concurrency
Concurrency is important in the modern world, but we need to be explicit about it.
#ArchitectureComponents #LiveData #ViewModel
Architecture Component (AC) довольно популярны в современной Android разработки, компоненты внутри #AndroidX переходят на использование их под капотом, SDK устаревают и рекомендуют переходить на AC. Но важно помнить один принцип: "С большой силой приходит большая отвественность", поэтому любая библиотека или паттерн должны использоваться правильно, чтобы приносить пользу.
Наиболее распространненые ошибки при работе с AC
1. Учечка LiveData observer в Fragment-ах
Все LiveData в Fragment которые обновляют UI, должны быть подписаны на изменения между onCreateView() и onDesctoyView(). Проблема в том, что стандартный LifecycleOwner Fragment-а отписывается после onDestroyView(). Решение этого является использование Fragment.viewLifecycleOwner, который доступен в AndroidX либо Android Support Library 28.0.0. На старых версихя Android придется отписываться руками в onDestroyView() 😢
2. Перезагрузка данных на каждом повороте/смене конфигурации
Тут рекомендую посмотреть код из статьи, там описан подробно пример того как это делается.
3. Утечка ViewModel-ей
Хранение ссылки на ViewModel не должно происходить где-либо кроме Fragment/Activity
4. Предоставление доступа к LiveData как изменяемой (MutableLiveData) to views
LiveData лежат в ViewModel и не должны быть публично модифицируемыми.
5. Создание зависимостей ViewModel-ей после каждого изменения конфигурации
Все зависимости, которые вы собирайтесь Inject-ить в ViewModel, в ViewModelProvider.Factory должны быть объвляне через Provider, который позволит корректно работать со Scope зависимостей.
"5 common mistakes when using Architecture Components"
Architecture Component (AC) довольно популярны в современной Android разработки, компоненты внутри #AndroidX переходят на использование их под капотом, SDK устаревают и рекомендуют переходить на AC. Но важно помнить один принцип: "С большой силой приходит большая отвественность", поэтому любая библиотека или паттерн должны использоваться правильно, чтобы приносить пользу.
Наиболее распространненые ошибки при работе с AC
1. Учечка LiveData observer в Fragment-ах
Все LiveData в Fragment которые обновляют UI, должны быть подписаны на изменения между onCreateView() и onDesctoyView(). Проблема в том, что стандартный LifecycleOwner Fragment-а отписывается после onDestroyView(). Решение этого является использование Fragment.viewLifecycleOwner, который доступен в AndroidX либо Android Support Library 28.0.0. На старых версихя Android придется отписываться руками в onDestroyView() 😢
2. Перезагрузка данных на каждом повороте/смене конфигурации
Тут рекомендую посмотреть код из статьи, там описан подробно пример того как это делается.
3. Утечка ViewModel-ей
Хранение ссылки на ViewModel не должно происходить где-либо кроме Fragment/Activity
4. Предоставление доступа к LiveData как изменяемой (MutableLiveData) to views
LiveData лежат в ViewModel и не должны быть публично модифицируемыми.
5. Создание зависимостей ViewModel-ей после каждого изменения конфигурации
Все зависимости, которые вы собирайтесь Inject-ить в ViewModel, в ViewModelProvider.Factory должны быть объвляне через Provider, который позволит корректно работать со Scope зависимостей.
class MoviesViewModelFactory(Выбрал я эти советы из статьи
val repository: Provider<MoviesRepository>,
val stringProvider: Provider<StringProvider>,
) : ViewModelProvider.Factory
"5 common mistakes when using Architecture Components"
Medium
5 common mistakes when using Architecture Components
Subtle oversights with more or less serious consequences - even if you’re not making these mistakes it should be worth keeping them in…