Size: a a a

Android Broadcast

2018 November 16
Android Broadcast
#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
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")
 }
}
источник
Android Broadcast
Отключение форматирования сгенерированного кода стоит делать только при разработке. Публиковать приложения рекомендуется с отформатированным кодов, иначе у вас могут быть проблемы с понимаем кода из стек трейсов.
источник
Android Broadcast
Подробнее о различных флагах комиляции Dagger 2 читайте

https://google.github.io/dagger/compiler-options
источник
Android Broadcast
Обратите внимание на режим "fastInit"  который может позволить вам ускорить инициализацию вашего графа при старте приложения, тем самым ускорив появление первого экрана
источник
2018 November 17
Android Broadcast
Пример с #InflationInject
источник
Android Broadcast
#OkHttp #LibUpdates

Вышел 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
источник
Android Broadcast
Перешли ли вы на 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.
источник
Android Broadcast
#Dagger #AndroidX #Fragment

Преимущественный способ доставки зависимостей в объекты является конструктор. Это позволяет гарантировать, что при создание объекта у вас есть все необходимое для его работы. К сожалению, стандартные компоненты 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
источник
Android Broadcast
То что я описал для Fragment можно сделать и для всех стандартных компонентов приложения с помощью AppComponentFactory. единственное огорчение - чтобы это можно было сделать у вашего приложения должно быть minSdk=28.
Остается дождаться этак года 2023, чтобы начать это использовать все приложения тотально стали писаться на Android P+. 😁
источник
Android Broadcast
#Kotlin #Coroutines #Concurrency

В продолжение своей серии статей о concurrency и корутинах Роман Елизаров поведывает о том как ситанксис Kotlin позволяет явно писать асинхронный вызовы и управлять ими

https://medium.com/@elizarov/explicit-concurrency-67a8e8fd9b25
источник
2018 November 18
Android Broadcast
#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 зависимостей.

class MoviesViewModelFactory(
   val repository: Provider<MoviesRepository>,
   val stringProvider: Provider<StringProvider>,
) : ViewModelProvider.Factory

Выбрал я эти советы из статьи
"5 common mistakes when using Architecture Components"
источник
Android Broadcast
#Animations #Transitions #Library #Kotlin

Transition X - новая удобная библиотека для описание  Transition анимаций при помощи Kotlin DSL
источник
Android Broadcast
источник
Android Broadcast
источник
Android Broadcast
#AndroidX #Migration

Результаты быстрого опроса по использованию AndroidX показали, что большая часть уже обновилась с Android Support Library. Правда перевес совсем незначительный.

Для тех кто не в курсе что это такое рекомендую начать отсюда "AndroidX Overview"
источник
Android Broadcast
Android Studio поможет вам в миграции, но не все так гладко 😔

Подробнее о миграции читайте в статье "The Reality of Migrating to AndroidX"
источник
2018 November 19
Android Broadcast
#Retrofit #LibUpdates #Networking

Вышел Retrofit 2.5.0. Основные изменения:
* Поддержка Unit типа из Kotlin. Ведет себя аналогично Void из Java.
* Поддержка Java 8 Optional и CompletableFuture. Поддержка заменяет необходимость настройки конвертера и зависимость "converter-java8" больше не поддерживается.
* Новые расширения для Kotlin, которые позволяют создавать реализацию, передавая только интерфейс как параметр generic-а.
retrofit.create<MyService>()

* Добавлены R8 правила внутри JAR. Теперь при использование R8 вам не надо добавлять собственные правила для Retrofit.
* Улучшения API
* Багфикс

Подробности
https://github.com/square/retrofit/blob/master/CHANGELOG.md#version-250-2018-11-18
источник
Android Broadcast
источник
Android Broadcast
#AndroidX #NightMode #Energy

Современные телефоны становятся мощнее, процессоры с каждым годом улучшаются, оперативной памяти становится больше, обычная память становится быстрее, но все это ограничивается батарейкой. Пользователи iPhone все время ходят с Power Bank 😁.

Сколько нулей будет состояние челока, который сможет сделать технологию, позволяющую избавиться от этих ограничений?

Android делает много в плане улучшения батарейки с софтвой стороны: Doze, Battery Saver, App Standby, Adaptive Battery, App Standby Buckets, Background Restricitions, JobScheduler, Power Consumption Proilers и др. К сожалению, это не дает больших преимуществ, когда вы используете свои приложения активно 😞

Хотите это исправить - добавьте темную (night) тему в свои приложения. Она позволяет сэкономить энергию, особенно на OLED дисплеях.

Почему это стоит делать и что для этого есть в AndroidX очень хорошо рассказали на Android Dev Summit.
источник
Android Broadcast
источник