#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 и как этого избежать
Application Not Responding (ANR) - это ошибка, которая возникает в результате приложение не отвечает. Условия возникновения ANR:
👉События ввода (кнопки, касания экрана и пр.) не обрабатываются 5 секунд
👉BroadcastReceiver.onReceive() не был обработан за отведенное время (foreground приложение - 10 сек, background - 60 сек)
👉ContentProvider не завершил выполнение в течение 10 секунд
Как избежать ANR:
👉 Вся работа, несвязанная с отображение, должна выноситься в фоновые потоки
👉 Сложные вычисления производятся в отдельном потоке
👉 Используйте Handler для взаимодействия между Main/UI потоком приложения и рабочими потоками
Удобными способами для выполнения операций в фоне является использование библиотек RxJava или Kotlin Coroutines
В статье также описывается откуда прорастает показ ANR диалога и как он показывается
Хабр
Причины возникновения ANR и как этого избежать
ANR (Application Not Responding) — ошибка, которая возникает, когда приложение не отвечает. В итоге открывается диалоговое окно, предлагающее пользователю подожд...
#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 поток не отвечает. Если такое событие происходит, библиотека выбрасывает ошибку
Подключение библиотеки
В Application.onCreate() добавьте
Рекомендую подключать библиотеку только в тестовых сборках вашего приложения и не включать его в production.
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.
GitHub
GitHub - SalomonBrys/ANR-WatchDog: A simple watchdog that detects Android ANR (Application Not Responding) error and throws a meaningful…
A simple watchdog that detects Android ANR (Application Not Responding) error and throws a meaningful exception - SalomonBrys/ANR-WatchDog
#Kotlin
The Argument Over Kotlin Synthetics
Kotlin Android Extensions призваны упростить жизнь Android разработчиков, они включают в себя:
👉 View Binding (отказ от findViewById)
👉 Generation of Parcelable (не надо руками писать реализацию)
Какова цена за эти удобства? Действительно ли все так удобно. Автор статьи решил рассмотреть почему не стоит использовать View Binding:
➖ Доступны только из Kotlin
➖ Не поддерживается Nullability
➖ Нет гарантий что сгенерированный код будет производительным
➖ Все находиться в глобальном пространстве имен
➖ Нет гарантий типов
The Argument Over Kotlin Synthetics
Kotlin Android Extensions призваны упростить жизнь Android разработчиков, они включают в себя:
👉 View Binding (отказ от findViewById)
👉 Generation of Parcelable (не надо руками писать реализацию)
Какова цена за эти удобства? Действительно ли все так удобно. Автор статьи решил рассмотреть почему не стоит использовать View Binding:
➖ Доступны только из Kotlin
➖ Не поддерживается Nullability
➖ Нет гарантий что сгенерированный код будет производительным
➖ Все находиться в глобальном пространстве имен
➖ Нет гарантий типов
Medium
The Argument Over Kotlin Synthetics
It all started with a commit message
#UI #Design
State of the Navigation Drawer
Navigation Drawer присутствует довольно давно в Android приложениях, но он имеет минусы:
➖ сокрытие навигации с экрана
➖ разработчики порой его перегружают элементами
➖ пользователи не видят новый функционал, которая добавляется в приложения
Как альтернатива Drawer предлагается использовать Bottom Navigation. Он позволяет решить проблемы, присущие Drawer, но также имеет ограничения, например он располагает от 3 до 5 элементов.
В своих последних приложения Google стала использовать комбинированный подход с Drawer и Bottom App Bar
Что сейчас имеет место и есть ли универсальное решение? Вопрос как всегда философский и не имеет четкого ответа. В статье автор сделал обзор существующих решений и их эффективности.
State of the Navigation Drawer
Navigation Drawer присутствует довольно давно в Android приложениях, но он имеет минусы:
➖ сокрытие навигации с экрана
➖ разработчики порой его перегружают элементами
➖ пользователи не видят новый функционал, которая добавляется в приложения
Как альтернатива Drawer предлагается использовать Bottom Navigation. Он позволяет решить проблемы, присущие Drawer, но также имеет ограничения, например он располагает от 3 до 5 элементов.
В своих последних приложения Google стала использовать комбинированный подход с Drawer и Bottom App Bar
Что сейчас имеет место и есть ли универсальное решение? Вопрос как всегда философский и не имеет четкого ответа. В статье автор сделал обзор существующих решений и их эффективности.
Medium
State of the Navigation Drawer
UI design patterns evolve. Some come into fashion and some go out of fashion. A pattern, once common, over used, and pervasive has been…
#AndroidX #ViewPager2 #HowItWorks
ViewPager2 under the Hood
На днях Google представила первую альфа версию ViewPager2. Я писал об это ранее. В статье разбирается как работает под капотом ViewPager2 и каким образом перенесли функциональность ViewPager на RecyclerView.
ViewPager2 under the Hood
На днях Google представила первую альфа версию ViewPager2. Я писал об это ранее. В статье разбирается как работает под капотом ViewPager2 и каким образом перенесли функциональность ViewPager на RecyclerView.
helw.net
ViewPager2 under the Hood
blog of ahmed el-helw
#Kotlin #NullSafety
Null is your friend, not a mistake
Null - это бич Java разработки или нет? Очень неприятно когда у вас падает NPE 😞. Чтобы это исправить было сделано много разных решений:
👉
👉 Optional Java 8
👉 Невозможность работы с
👉 Куча
👉 Статические анализаторы кода
Все решения имеют свои плюсы + работают не всегда.
Kotlin решил эту проблемы намного изящнее все типы делятся на Nullable и NonNullable, который четко определяют можно ли быть у вас null значение в типе и при обращение будет заставлять обрабатывать.
Роман Элизаров (папка Kotlin Coroutines) в статье рассказывает почему null - это не есть зло и как Kotlin эффективно организовал работу с такими типами значений!
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 эффективно организовал работу с такими типами значений!
Medium
Null is your friend, not a mistake
NullPointerException is dreaded in Java. All sorts of workarounds exist to avoid nulls. Fear not. They are not needed with Kotlin.
#RecyclerView #Animation #DiffUtil
RecyclerView — time to animate! (with payloads and DiffUtil)
Что вы знаете о
В статье раскрываются подробности как анимировать изменения RecyclerView на основе описанного механизма.
RecyclerView — time to animate! (with payloads and DiffUtil)
Что вы знаете о
payload в RecyclerView.Adapter.notifyItemChanged(int position, Object payload) ? Она позволяет вам сообщать что изменилось, а не заставляет обновить целый элемент в RecyclerView. DiffUtil также поддерживаются payload и позволяет вам точечно обновлять элементы списка. В статье раскрываются подробности как анимировать изменения RecyclerView на основе описанного механизма.
Undabot
RecyclerView — time to animate! (with payloads and DiffUtil)
Throughout this post I will explain how to initiate default RecyclerView animations. The focus will be on the payloads and DiffUtil…
#R8 #Optimizations #String
R8 Optimization: String Constant Operations
Продолжение серии статей от Jake Wharton о оптимизациях в R8. В новой статье рассказывает о оптимизация строковых констант:
👉 Операции со строками
👉 Встраивание
👉 Оценка эффективности оптимизаций
R8 Optimization: String Constant Operations
Продолжение серии статей от Jake Wharton о оптимизациях в R8. В новой статье рассказывает о оптимизация строковых констант:
👉 Операции со строками
👉 Встраивание
👉 Оценка эффективности оптимизаций
Jake Wharton
R8 Optimization: String Constant Operations – Jake Wharton
#IoT #AndroidThings
An Update on Android Things
Google меняет фокус Android Things как платформу для OEM партнеров для того чтобы делать умные колонки и дисплее.
An Update on Android Things
Google меняет фокус Android Things как платформу для OEM партнеров для того чтобы делать умные колонки и дисплее.
Android Developers Blog
An Update on Android Things
Posted by Dave Smith , Developer Advocate for IoT Over the past year, Google has worked closely with partners to create consumer product...
#Architecture #RIBs
RIBs - Uber's cross-platform mobile architecture framework
Uber открыла доступ к своей библиотеке RIBs, которая позволяет создавать кросс-платформенную архитектуру для Android и iOS приложений. Фреймворк разрабатывался для мобильных приложений с большим количеством разработчиков.
Остается ждать насколько она приживётся
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 больше не требует возвращения
👉 Добавлена поддержка @OnTextChanged и @OnPageChange в
👉 Улучшения в
ButterKnife 10.1.0 was released
Вышло обновление ButterKnife 10.1.0. Что нового:
👉 Слушатель для OnLongClickListener больше не требует возвращения
boolean и может возвращать void👉 Добавлена поддержка @OnTextChanged и @OnPageChange в
butterknife-reflect👉 Улучшения в
butterknife-reflectGitHub
butterknife/CHANGELOG.md at master · JakeWharton/butterknife
Bind Android views and callbacks to fields and methods. - JakeWharton/butterknife
#ThreeTen #Backport #JakeWharton
ThreeTenABP 1.1.2
Вышло очередное обновление ThreeTenABP - обертка библиотеки ThreeTen бекпорта Java 8 Data/Time API. Релиз обновил базу данных по временным зонам и обновил базируемую версию ThreeTen до 1.3.8
ThreeTenABP 1.1.2
Вышло очередное обновление ThreeTenABP - обертка библиотеки ThreeTen бекпорта Java 8 Data/Time API. Релиз обновил базу данных по временным зонам и обновил базируемую версию ThreeTen до 1.3.8
GitHub
Release 1.1.2 · JakeWharton/ThreeTenABP
Version 1.1.2
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 функция
2️⃣ suspend функция
3️⃣ Добавление suspend непосредственно к функции в интерфейсе
Выглядеть использование будет так:
Retrofit meets coroutines
В Retrofit приходит официальная поддержка Coroutines от автор библиотеки. Пока изменения доступны только в snapshot версии, но уже в следующем релизе их можно будет начать корутинить ваши REST интерфейсы.
Появились новые возможности:
1️⃣ suspend функция
Call<T>.await() : T2️⃣ 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)}zsmb.co
Retrofit meets coroutines - zsmb.co
Retrofit's coroutine support has been a long time coming, and it's finally coming to completion. Take a look at how you can use it to neatly integrate networking into an application built with coroutines.
#AlarmManager
Using AlarmManager like a pro
В приложениях бывает необходимым вызывать событие в определенное время или с периодичностью, независимо от работы приложения. Для в Android служит AlarmManager. Но он имеет много подводных камней:
👉 Время срабатывания вызова не является гарантировано точным
👉 Особенности работы в режиме при ограничение системой потребления энергии (Doze, App Standby, Adaptive Battery и пр.)
👉 Сброс всех alarm при перезагрузке устройства и смене времени
👉 При создание alarm в прошлом он сработает мгновенно
В статье описывается решения как правильно восстанавливать alarm при их затирании системой
Using AlarmManager like a pro
В приложениях бывает необходимым вызывать событие в определенное время или с периодичностью, независимо от работы приложения. Для в Android служит AlarmManager. Но он имеет много подводных камней:
👉 Время срабатывания вызова не является гарантировано точным
👉 Особенности работы в режиме при ограничение системой потребления энергии (Doze, App Standby, Adaptive Battery и пр.)
👉 Сброс всех alarm при перезагрузке устройства и смене времени
👉 При создание alarm в прошлом он сработает мгновенно
В статье описывается решения как правильно восстанавливать alarm при их затирании системой
Medium
Using AlarmManager like a pro
All of us must have used AlarmManager in some way but there a lot of times when the alarm gets cancelled or there are bugs in the…
#RxJava #Lifecycle #Uber
RxJava2 AutoDispose by Uber was opened
Uber открыла доступ к своей библиотеке AutoDispose. Она позволяете автоматически вызывать
ПОд капотом все выполняется с помощью метода-фабрики autoDisposable() следующим образом:
Поддерживается основные компоненты Android с жизненным циклом, Architecture Components, RxLifecycle, есть расширения для Kotlin и тестов
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 и тестов
GitHub
GitHub - uber/AutoDispose: Automatic binding+disposal of RxJava streams.
Automatic binding+disposal of RxJava streams. Contribute to uber/AutoDispose development by creating an account on GitHub.
#GooglePlay #AndroidVitals
Monitor and improve app performance with Android vitals
Запись доклада от Google Play Console команды, в котором рассказывается как такие факторы как стабильность, рендеринг и потребление батареи влияет на скорость ваших приложений со технической и бизнес сторон.
Также демонстрируется как эффективно использовать информацию из Android Vitals в Google Play консоле для того чтобы понимать производительность вашего приложения и как понять что у вас есть проблемы.
В рамках видео также будет сделано демо Android Vitals
Monitor and improve app performance with Android vitals
Запись доклада от Google Play Console команды, в котором рассказывается как такие факторы как стабильность, рендеринг и потребление батареи влияет на скорость ваших приложений со технической и бизнес сторон.
Также демонстрируется как эффективно использовать информацию из Android Vitals в Google Play консоле для того чтобы понимать производительность вашего приложения и как понять что у вас есть проблемы.
В рамках видео также будет сделано демо Android Vitals
YouTube
Monitor and improve app performance with Android vitals
In this recording of an App Hub Live session, the Google Play Console team discusses how factors such as stability, rendering, and battery consumption affect your app’s performance from both a technical and business perspective. The team demonstrates how…
#Kotlin #Coroutines #BestPractices
Android Kotlin Coroutine Best Practices
Рекомендации по использованию корутин:
👉 Обрабатывайте жизненный цикл: необходимо останавливать корутины по выходу из Activity/Fragment
👉 Обрабатывайте исключения
👉 Не используйте напрямую CoroutineDispatcher из Dispatchers. Создавайте интерфейс через который вы будете представлять различные CoroutineDispatcher, а вот в его реализации можете делать брать их уже откуда хотите.
👉 Не забывайте что корутины - это асинхронный подход и не стоит модифицировать данные из нескольких корутин
👉 Правильно настраивайте правила для ProGuard
👉 Для обратной совместимости с Java 8+ конвертируете корутины в CompletableFuture с помощью CoroutineScope.future (нужна подключенная библиотека
👉 Многий библиотеки не требуют задание Dispatcher чтобы выполняться в другом потоке, так как они уже по умолчанию внутри себя работают на другом потоке. Например Retrofit
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
Medium
Android Kotlin Coroutine Best Practices
The is a continuously maintained set of best practices for using Kotlin Coroutines on Android. Please comment below if you have any…
#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
👉 Используйте физические устройства, а не эмуляторы
Is Your Android Studio Always Slow? 🚀Here’s How to Speed Up Immediately
Android Studio (AS) - это не самый быстрый софт. Обрастая новым функционалом каждый релиз, она становится все тяжелее и медленнее. Это печалит всех 😞.
Есть пара рекомендаций, чтобы оптимизировать работу AS:
👉 Отключите неиспользуемые плагины
👉 Используйте Gradle Offline режим
👉 Отключите параллельную режим Gradle
👉 Отключите Instant Run
👉 Используйте физические устройства, а не эмуляторы
Medium
⚡ Is Your Android Studio Always Slow? 🚀Here’s How to Speed Up Immediately.
A very quick and effective trick to boost Android Studio