В приложениях бывает необходимым вызывать событие в определенное время или с периодичностью, независимо от работы приложения. Для в Android служит AlarmManager. Но он имеет много подводных камней: 👉 Время срабатывания вызова не является гарантировано точным 👉 Особенности работы в режиме при ограничение системой потребления энергии (Doze, App Standby, Adaptive Battery и пр.) 👉 Сброс всех alarm при перезагрузке устройства и смене времени 👉 При создание alarm в прошлом он сработает мгновенно
В статье описывается решения как правильно восстанавливать alarm при их затирании системой
В 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) }
Вышло очередное обновление ThreeTenABP - обертка библиотеки ThreeTen бекпорта Java 8 Data/Time API. Релиз обновил базу данных по временным зонам и обновил базируемую версию ThreeTen до 1.3.8
Вышло обновление ButterKnife 10.1.0. Что нового: 👉 Слушатель для OnLongClickListener больше не требует возвращения boolean и может возвращать void 👉 Добавлена поддержка @OnTextChanged и @OnPageChange в butterknife-reflect 👉 Улучшения в butterknife-reflect
Uber открыла доступ к своей библиотеке RIBs, которая позволяет создавать кросс-платформенную архитектуру для Android и iOS приложений. Фреймворк разрабатывался для мобильных приложений с большим количеством разработчиков.
Продолжение серии статей от Jake Wharton о оптимизациях в R8. В новой статье рассказывает о оптимизация строковых констант: 👉 Операции со строками 👉 Встраивание 👉 Оценка эффективности оптимизаций
Null - это бич Java разработки или нет? Очень неприятно когда у вас падает NPE 😞. Чтобы это исправить было сделано много разных решений: 👉@Nullable, @NonNull аннотации 👉 Optional Java 8 👉 Невозможность работы с null, например RxJava 2 типы не могут эмитировать null значения 👉 Куча if(value != null) 👉 Статические анализаторы кода
Все решения имеют свои плюсы + работают не всегда.
Kotlin решил эту проблемы намного изящнее все типы делятся на Nullable и NonNullable, который четко определяют можно ли быть у вас null значение в типе и при обращение будет заставлять обрабатывать.
Роман Элизаров (папка Kotlin Coroutines) в статье рассказывает почему null - это не есть зло и как Kotlin эффективно организовал работу с такими типами значений!
Navigation Drawer присутствует довольно давно в Android приложениях, но он имеет минусы: ➖ сокрытие навигации с экрана ➖ разработчики порой его перегружают элементами ➖ пользователи не видят новый функционал, которая добавляется в приложения
Как альтернатива Drawer предлагается использовать Bottom Navigation. Он позволяет решить проблемы, присущие Drawer, но также имеет ограничения, например он располагает от 3 до 5 элементов.
В своих последних приложения Google стала использовать комбинированный подход с Drawer и Bottom App Bar
Что сейчас имеет место и есть ли универсальное решение? Вопрос как всегда философский и не имеет четкого ответа. В статье автор сделал обзор существующих решений и их эффективности.
Kotlin Android Extensions призваны упростить жизнь Android разработчиков, они включают в себя: 👉 View Binding (отказ от findViewById) 👉 Generation of Parcelable (не надо руками писать реализацию)
Какова цена за эти удобства? Действительно ли все так удобно. Автор статьи решил рассмотреть почему не стоит использовать View Binding: ➖ Доступны только из Kotlin ➖ Не поддерживается Nullability ➖ Нет гарантий что сгенерированный код будет производительным ➖ Все находиться в глобальном пространстве имен ➖ Нет гарантий типов
Application Not Responding (ANR) - это ошибка, которая возникает в результате приложение не отвечает. Условия возникновения ANR: 👉События ввода (кнопки, касания экрана и пр.) не обрабатываются 5 секунд 👉BroadcastReceiver.onReceive() не был обработан за отведенное время (foreground приложение - 10 сек, background - 60 сек) 👉ContentProvider не завершил выполнение в течение 10 секунд
Как избежать ANR: 👉 Вся работа, несвязанная с отображение, должна выноситься в фоновые потоки 👉 Сложные вычисления производятся в отдельном потоке 👉 Используйте Handler для взаимодействия между Main/UI потоком приложения и рабочими потоками
Удобными способами для выполнения операций в фоне является использование библиотек RxJava или Kotlin Coroutines
В статье также описывается откуда прорастает показ ANR диалога и как он показывается
Единственный способ для Android приложения поймать ANR - это опубликовать его в Google Play и смотреть за их статистикой в консоле.Очень полезно получать ошибки с ANR во время разработки и тестирования.
Библиотека ANR-WatchDog призвана решить эту проблема. Она настраивает таймеры на определение того, что ваш Main/UI поток не отвечает. Если такое событие происходит, библиотека выбрасывает ошибку ANRError. При включенном дебагере библиотека отключается.
Подключение библиотеки implementation 'com.github.anrwatchdog:anrwatchdog:1.3.0'
В Application.onCreate() добавьте new ANRWatchDog().start();
Рекомендую подключать библиотеку только в тестовых сборках вашего приложения и не включать его в production.
В Chromium 72 официально анонсировали поддержку Trusted Web Activity (TWA). Это позволяет вашему приложению отображать Web контент в Chrome Custom tab или WebView без UI браузера в полноэкранном режиме.