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

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

https://medium.com/@elizarov/explicit-concurrency-67a8e8fd9b25
#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"
#Animations #Transitions #Library #Kotlin

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

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

Для тех кто не в курсе что это такое рекомендую начать отсюда "AndroidX Overview"
#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
#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.