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

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

РКН https://abdev.by/rkn_tg_ab #MQRZR
Download Telegram
#ANR

Причины возникновения ANR и как этого избежать

Application Not Responding (ANR) - это ошибка, которая возникает в результате приложение не отвечает. Условия возникновения ANR:
👉События ввода (кнопки, касания экрана и пр.) не обрабатываются 5 секунд
👉BroadcastReceiver.onReceive() не был обработан за отведенное время (foreground приложение - 10 сек, background - 60 сек)
👉ContentProvider не завершил выполнение в течение 10 секунд

Как избежать ANR:
👉 Вся работа, несвязанная с отображение, должна выноситься в фоновые потоки
👉 Сложные вычисления производятся в отдельном потоке
👉 Используйте Handler для взаимодействия между Main/UI потоком приложения и рабочими потоками

Удобными способами для выполнения операций в фоне является использование библиотек RxJava или Kotlin Coroutines

В статье также описывается откуда прорастает показ ANR диалога и как он показывается
#ANR #Library

ANR-WatchDog - A simple watchdog that detects Android ANR error and throws a meaningful exception

Единственный способ для Android приложения поймать ANR - это опубликовать его в Google Play и смотреть за их статистикой в консоле.Очень полезно получать ошибки с ANR во время разработки и тестирования.

Библиотека ANR-WatchDog призвана решить эту проблема. Она настраивает таймеры на определение того, что ваш Main/UI поток не отвечает. Если такое событие происходит, библиотека выбрасывает ошибку ANRError. При включенном дебагере библиотека отключается.

Подключение библиотеки
implementation 'com.github.anrwatchdog:anrwatchdog:1.3.0'

В Application.onCreate() добавьте
new ANRWatchDog().start();

Рекомендую подключать библиотеку только в тестовых сборках вашего приложения и не включать его в production.
#Kotlin

The Argument Over Kotlin Synthetics

Kotlin Android Extensions призваны упростить жизнь Android разработчиков, они включают в себя:
👉 View Binding (отказ от findViewById)
👉 Generation of Parcelable (не надо руками писать реализацию)

Какова цена за эти удобства? Действительно ли все так удобно. Автор статьи решил рассмотреть почему не стоит использовать View Binding:
Доступны только из Kotlin
Не поддерживается Nullability
Нет гарантий что сгенерированный код будет производительным
Все находиться в глобальном пространстве имен
Нет гарантий типов
#UI #Design

State of the Navigation Drawer

Navigation Drawer присутствует довольно давно в Android приложениях, но он имеет минусы:
сокрытие навигации с экрана
разработчики порой его перегружают элементами
пользователи не видят новый функционал, которая добавляется в приложения

Как альтернатива Drawer предлагается использовать Bottom Navigation. Он позволяет решить проблемы, присущие Drawer, но также имеет ограничения, например он располагает от 3 до 5 элементов.

В своих последних приложения Google стала использовать комбинированный подход с Drawer и Bottom App Bar

Что сейчас имеет место и есть ли универсальное решение? Вопрос как всегда философский и не имеет четкого ответа. В статье автор сделал обзор существующих решений и их эффективности.
#AndroidX #ViewPager2 #HowItWorks

ViewPager2 under the Hood

На днях Google представила первую альфа версию ViewPager2. Я писал об это ранее. В статье разбирается как работает под капотом ViewPager2 и каким образом перенесли функциональность ViewPager на RecyclerView.
#Kotlin #NullSafety

Null is your friend, not a mistake

Null - это бич Java разработки или нет? Очень неприятно когда у вас падает NPE 😞. Чтобы это исправить было сделано много разных решений:
👉 @Nullable, @NonNull аннотации
👉 Optional Java 8
👉 Невозможность работы с null, например RxJava 2 типы не могут эмитировать null значения
👉 Куча if(value != null)
👉 Статические анализаторы кода

Все решения имеют свои плюсы + работают не всегда.

Kotlin решил эту проблемы намного изящнее все типы делятся на Nullable и NonNullable, который четко определяют можно ли быть у вас null значение в типе и при обращение будет заставлять обрабатывать.

Роман Элизаров (папка Kotlin Coroutines) в статье рассказывает почему null - это не есть зло и как Kotlin эффективно организовал работу с такими типами значений!
#RecyclerView #Animation #DiffUtil

RecyclerView — time to animate! (with payloads and DiffUtil)

Что вы знаете о payload в RecyclerView.Adapter.notifyItemChanged(int position, Object payload) ? Она позволяет вам сообщать что изменилось, а не заставляет обновить целый элемент в RecyclerView. DiffUtil также поддерживаются payload и позволяет вам точечно обновлять элементы списка.

В статье раскрываются подробности как анимировать изменения RecyclerView на основе описанного механизма.
#R8 #Optimizations #String

R8 Optimization: String Constant Operations

Продолжение серии статей от Jake Wharton о оптимизациях в R8. В новой статье рассказывает о оптимизация строковых констант:
👉 Операции со строками
👉 Встраивание
👉 Оценка эффективности оптимизаций
#IoT #AndroidThings

An Update on Android Things

Google меняет фокус Android Things как платформу для OEM партнеров для того чтобы делать умные колонки и дисплее.
#Architecture #RIBs

RIBs - Uber's cross-platform mobile architecture framework

Uber открыла доступ к своей библиотеке RIBs, которая позволяет создавать кросс-платформенную архитектуру для Android и iOS приложений. Фреймворк разрабатывался для мобильных приложений с большим количеством разработчиков.

Остается ждать насколько она приживётся
👍1
#LibUpdates #ButterKnife #JakeWharton

ButterKnife 10.1.0 was released

Вышло обновление ButterKnife 10.1.0. Что нового:
👉 Слушатель для OnLongClickListener больше не требует возвращения boolean и может возвращать void
👉 Добавлена поддержка @OnTextChanged и @OnPageChange в butterknife-reflect
👉 Улучшения в butterknife-reflect
#ThreeTen #Backport #JakeWharton

ThreeTenABP 1.1.2

Вышло очередное обновление ThreeTenABP - обертка библиотеки ThreeTen бекпорта Java 8 Data/Time API. Релиз обновил базу данных по временным зонам и обновил базируемую версию ThreeTen до 1.3.8
Forwarded from The Daily Kotlin (Ruslan Ibragimov)
This media is not supported in your browser
VIEW IN TELEGRAM
А Kotlin уже три годика 🎉
#Retrofit #Coroutines #Kotlin

Retrofit meets coroutines

В Retrofit приходит официальная поддержка Coroutines от автор библиотеки. Пока изменения доступны только в snapshot версии, но уже в следующем релизе их можно будет начать корутинить ваши REST интерфейсы.

Появились новые возможности:
1️⃣ suspend функция Call<T>.await() : T
2️⃣ suspend функция Call<T>.awaitResponse(): Response<T>
3️⃣ Добавление suspend непосредственно к функции в интерфейсе

Выглядеть использование будет так:

interface SpaceXApi {
@GET("rockets")
suspend fun getRockets(): Call<List<Rocket>>
}

val api = retrofit.create<SpaceXApi>()

runBlocking {
val rockets = api.getRockets()
rockets.forEach(::println)
}
#AlarmManager

Using AlarmManager like a pro

В приложениях бывает необходимым вызывать событие в определенное время или с периодичностью, независимо от работы приложения. Для в Android служит AlarmManager. Но он имеет много подводных камней:
👉 Время срабатывания вызова не является гарантировано точным
👉 Особенности работы в режиме при ограничение системой потребления энергии (Doze, App Standby, Adaptive Battery и пр.)
👉 Сброс всех alarm при перезагрузке устройства и смене времени
👉 При создание alarm в прошлом он сработает мгновенно

В статье описывается решения как правильно восстанавливать alarm при их затирании системой
#RxJava #Lifecycle #Uber

RxJava2 AutoDispose by Uber was opened

Uber открыла доступ к своей библиотеке AutoDispose. Она позволяете автоматически вызывать dispose() вашим Observable

ПОд капотом все выполняется с помощью метода-фабрики autoDisposable() следующим образом:

myObservable
.doStuff()
.as(autoDisposable(this)) // The magic
.subscribe(s -> ...);

Поддерживается основные компоненты Android с жизненным циклом, Architecture Components, RxLifecycle, есть расширения для Kotlin и тестов
#GooglePlay #AndroidVitals

Monitor and improve app performance with Android vitals

Запись доклада от Google Play Console команды, в котором рассказывается как такие факторы как стабильность, рендеринг и потребление батареи влияет на скорость ваших приложений со технической и бизнес сторон.

Также демонстрируется как эффективно использовать информацию из Android Vitals в Google Play консоле для того чтобы понимать производительность вашего приложения и как понять что у вас есть проблемы.

В рамках видео также будет сделано демо Android Vitals
#Kotlin #Coroutines #BestPractices

Android Kotlin Coroutine Best Practices

Рекомендации по использованию корутин:
👉 Обрабатывайте жизненный цикл: необходимо останавливать корутины по выходу из Activity/Fragment
👉 Обрабатывайте исключения
👉 Не используйте напрямую CoroutineDispatcher из Dispatchers. Создавайте интерфейс через который вы будете представлять различные CoroutineDispatcher, а вот в его реализации можете делать брать их уже откуда хотите.
👉 Не забывайте что корутины - это асинхронный подход и не стоит модифицировать данные из нескольких корутин
👉 Правильно настраивайте правила для ProGuard
👉 Для обратной совместимости с Java 8+ конвертируете корутины в CompletableFuture с помощью CoroutineScope.future (нужна подключенная библиотека kotlinx-coroutines-jdk8). На Android это будет работать только для Android 7.0+
👉 Многий библиотеки не требуют задание Dispatcher чтобы выполняться в другом потоке, так как они уже по умолчанию внутри себя работают на другом потоке. Например Retrofit
#ProGuard #Kotlin #Coroutines

-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}
-keepclassmembernames class kotlinx.** { volatile <fields>; }
#AndroidStudio

Is Your Android Studio Always Slow? 🚀Here’s How to Speed Up Immediately

Android Studio (AS) - это не самый быстрый софт. Обрастая новым функционалом каждый релиз, она становится все тяжелее и медленнее. Это печалит всех 😞.

Есть пара рекомендаций, чтобы оптимизировать работу AS:
👉 Отключите неиспользуемые плагины
👉 Используйте Gradle Offline режим
👉 Отключите параллельную режим Gradle
👉 Отключите Instant Run
👉 Используйте физические устройства, а не эмуляторы