Android Broadcast
14.2K subscribers
3.52K photos
340 videos
11 files
5.89K links
Подборка новостей и статей для Android разработчиков.

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

РКН https://abdev.by/rkn_tg_ab
Download Telegram
#Новости

Всем привет! Вот уже пошел третий день как на канале не появляются новости. Я не ленюсь и все также смотрю и читаю новости, пытаюсь найти что-то интересное, но видно все авторы ушли в новогодние 🎄и рождественские 🔔праздники, в связи с чем и контента пока будет меньше чем обычно.

Вы всегда можете поскролить вверх, посмотреть ранние статьи или нажать хэштег и найти всё по интересующей вас теме.
#BestPractices

The Seven (Actually 10) Cardinal Sins of Android Development

Мы все крутые программисты, но даже мы можем допустить ошибки. Спешим быстрее закончить, чтобы переключиться на новую задачу. Может сроки жмут и надо быстрее сдать или уже накрыт стол и какое тут до задач. Довольно часто причиной служит незнание каких-то аспектов.

В статье разбираются ошибки, которые не стоит допускать в вашем коде. С чем-то из этого вы будете знакомы, а с чем-то нет:
👉 Статические ссылки на Android компоненты с жизненным циклом (Activity/Fragment/View и др.)
👉 Неправильно получение ссылки на Fragment
👉 Хранение Fragment в FragmentPagerAdapter (ViewPager)
👉 Аргументы в конструкторе Fragment
👉 Задание переменных Fragment с использованием set функций при создании
👉 Не сохранять состояние через в Bundle при использование ViewModel
👉 Загружать данные только при savedInstanceState == null
👉 Инициализация Fragment в некорректном состоянии
👉 Переопределение onResume()/onPause() для всего подряд
👉 Не final static переменные
#LiveData #Kotlin #Nullability

Improving LiveData nullability in Kotlin

Не раздражало ли вас, что при объявлении LiveData<Value> в Kotlin, вы все равно можете получить null в Observer или задать null значение через LiveData.value?

Проблема заключается в том, что LiveData написана на Java и ничего не знает о системе типов в Kotlin и особенностях Generic. Исправить это через -ktx библиотеки не получится, так как надо переписывать LiveData на Kotlin или иметь спец аннотации для Java, чтобы обеспечивать совместимость.

В статье автор описывает не самое красивое решение, но эффективное - создание подкласса MutableLiveData с полной поддержкой Kotlin.
#Coroutines #Flow #Reactive

Back-pressure in Kotlin Flows

Back-pressure - это та вещь про которую надо задумываться когда вы работает с Reactive подходами. Back-pressure - это когда источник данных посылает новые данные быстрее чем им может обработать подписчик. Из-за этого возникает необходимость задания политики что делать с очередью данных.

В статье разбирается как об Back-pressure не надо задумываться когда вы используете Coroutine Flow, благодаря suspend функциям и принципам их работы.
#AndroidX #Browser

AndroidX Browser 1.2.0

Вышла новая мажорная версия библиотеки Browser 1.2.0 в которой произошли следующие ключевые изменения:
👉 Поддержка Trusted Web Activities вышла в Stable
👉 Поддержка темной темы для ChromeCustomTab
👉 CustomTabsSession может быть создана с заданным заранее id, что позволяет объединять сессию с одного клиента для последовательно запущенных CustomTab
#Dagger #IDEA

Introducing Scabbard: Easily visualize Dagger 2 dependency graphs

Это случилось - плагин для визуализации графа зависимостей Dagger 2. И называется это счастье - Scabbard. Он позволяет увидеть Component, Subcomponent, зависимости, их Scope и отношения между ними.

Проект еще в разработке и находится в версии 0.1.0
👉 Gihub проекта
👉 Инструкция по настройке
This media is not supported in your browser
VIEW IN TELEGRAM
Пример визуализации графа из Android Studio
#AndroidOS

System App In Android

Все приложения делятся на 2 категории: системные и сторонние. Большинству разработчиков приходится сталкиваться со второй категорией приложений и распространять их через магазины приложений.

Но что могут делать системные приложения? Почему нам не дают их заменить? Почему разработчики стороннего лаунчера или звонилки не могут получить все возможности предустановленного приложения?

В статье разбираются особенности системных приложений и их возможности, которые не даны простым сторонним приложениям.
#Splash #Coroutines

A Guide on Splash Screen in Android in 2020

Экран-заставка (Splash Screen) довольно часто явление в мобильных приложениях. Цели его разные:
👉 Красивое интро в приложение
👉 Начальная Activity приложения определяется динамически
👉 Быстры рендеринг просто экрана, пока идет инициализация приложения (холодный старт)
👉 Комбинация описанных выше пунктов 😁

В статье рассматриваются рекомендации по созданию Splash Screen:
👉 Использование android:windowBackground для задания фона экрана
👉 Как правильно отсчитывать время до закрытия Splash Screen: Handler / Timer / Coroutines
Есть ли Splash Screen в ваших приложениях?
Anonymous Poll
84%
Да
16%
Нет
#Новости

Вот и наступил новый год. Для меня 2019-й год прошёл очень бодро и с множеством событий как в работе, так и моей активности за её рамками. Одно из самых неожиданных стало для меня, что канал «Android Broadcast» прижился и я слышу положительные отзывы, а также идеи того, что сделать лучше от вас (статистику можно посмотреть выше 📈 ⬆️)

Я желаю вам в новом году активного роста высших навыков 💪, покорения новых вершин 🔝, и всего самого наилучшего вам и вашим семьям.

С большим уважением, автор канала Кирилл Розов
#OkHttp #Networking

Вышел OkHttp 4.3.0

Пока вчера все готовились к празднованию нового года ребята из OkHttp решили сделать новый релиз. Список изменений небольшой и имеет только одну новое важное изменение:
👉 Более агрессивное переиспользование потоков между OkHttp's HTTP/2 соединениями, connection pool, web socket-ами, и кэшем
👉 Обновление до Kotlin 1.3.61
👉 Исправление багов
#MemoryLeak #LeakCanary

Вышел LeakCanary 2.1.0

Популярная утилита для поиска утечек памяти развивается дальше. После недавне представленной версии 2.0 уже выходит следующее минорное обновление, в которое попали новые функции:
👉 Gradle плагин для обфусцированных приложений. Раньше была проблема, что при тестировании обфусцированной сборки приложения (с R8 или ProGuard) все стектрейсы было бесполезно смотреть с устройства так, как все названия классов/методов были изменены. Встречайте LeakCanary gradle плагин для обфусцированных приложений, которые решает это
👉 Множество улучшений в UI приложения для просмотра утечек памяти на устройства
👉 Улучшение документации
👉 Улучшение в API Leak и LeakTrace
👉 Автоматическое отключение LeakCanary, если в classpath найден заданный класс. По умолчанию этим классом является org.junit.Test
👉 Возможность изменения способа с помощью которого LeakCanary ищет утечки памяти в heap dump
👉 Интерактивный режим работы CLI
#LeakCanary #Reporting #Bugsnag

LeakCanary: Uploading to Bugsnag

Авторы LeakCanary рассказали о том, как они отслеживают утечки памяти в проде и уже не пропускают ни одной из таких проблем 3 года. Делают это они с помощью выгрузки leak trace на Bugsnag. Как это реализовать вы можете найти по ссылке.

Пример как будет выглядеть отчёт в Bug Snag можно найти в посту ниже ⬇️⬇️⬇️
Пример как выглядет leak trace из LeakCanary в Bugsnag
#Activity #Architecture

ActivityLifecycleCallbacks — слепое пятно в публичном API

ActivityLifecycleCallbacks - это полезное API, которое позволит вам избавиться от супер класса для всех Activity, в котором вы выполняете общие действия, или элегантно решить архитектурную задачу или сделать много чего еще полезного, о чем автор рассказывает в статье:
👉 Изменять темы для всех Activity
👉 Отловить onActivityResult()
👉 Отслеживать запускаемый экраны для аналитики
👉 Улучшить inject зависимостей через Dagger Android

Если вам нужно отслеживать через callback жизненный цикл Fragment, то вы можете использовать FragmentLifecycleCallbacks.
#Coroutines #Channel

Kotlin Coroutines in Android — Channel

Разбор Channel для предоставления набора значений (горячего):
👉 Что такое Channel и с чем он схож
👉 offer() vs send()
👉 poll() vs receive()
👉 Закрытие Channel
👉 close() vs cancel()
👉 Типы Channel: Rendezvous, Buffered, Unlimited, Conflated
#Video #FFmpeg

Video Trimmer

Полезная библиотека, которая позволит вам вырезать кусов видео или вырезать кадры. Под капотом используется FFmpeg
1
#UI #Performance

ViewStub: On-demand inflate view or lazily inflate layout resource

Как часто в UI вам приходится добавлять View, которые показываются по условию? Один из самых распространённые случаев - это показ UI при ошибках, отсутсвие сети или данных.

Как решают такую задачу разработчики? Зачастую просто складируют весь UI в одном Layout XML и используют visibility=“gone|visible”. Но проблема в таком решение заключается, что все View у которых видимость gone и не отрисовываются на экране, но приложение тратит время на их парсинг, создание и добавление в иерархию, хотя по сути эти View могут даже не понадобиться вовсе.

В Android SDK уже давно есть решение этому - ViewStub, которое позволяет вызывать inflate Layout XML отложено.