Разработка библиотек - не самое простое занятие. Ты не можешь получить отчет об ошибке в Crashlytics, твои пользователи (программисты) не всегда могут оставить внятный фидбек, а еще тебе надо обеспечивать обратную совместимость.
Обратную совместимость обычно разделяют на 2 вида: API и Binary. Первая довольная проста - все что написано на старой версии библиотеки, должно запускаться и на новой.
С Binary совместимость все сложнее. В статье один из авторов библиотеки Reaktive разбирает, что именно такое Binary совместимость и как ее обеспечивают на примере этой библиотеки.
Механизм Span - мощный инструмент для кастомизации текста. В статье разбирается пример как сделать фон текста с закруглением и особенности при работе с многострочным текстом
Kotlin Coroutine - это не только другой стиль написания асинхронного кода (по сравнению с Java Thread), но и отличия в реализации использования Java потоков под капотом. Coroutine реализованы на основе continuation-passing style. Это ведёт к тому, что не все средства синхронизации к которым привыкли разработчики с Java будут работать с Kotlin Coroutines.
В статье разбирается особенность работы synchronized и почему не стоит его использовать с Coroutine.
В новой версии статического анализатора Kotlin кода вы найдёте: 👉 Detekt теперь по умолчанию «тихий». Это значит, что в выводе будут появляться только сообщения об найденных проблемах 👉 Detekt по умолчанию будут помечать сборку как «failed» если найдена хотя бы одна проблема 👉 Улучшение HTML отчетов 👉 Новое правило ExplicitCollectionElementAccessMethod - замена вызова get() и set() у List и Map на синтаксис через [] 👉 Новое правило ForbiddenMethod - возможность задать список методов, запрещенных к вызову 👉 Исправление багов
Новая версия популярного DI фреймворка увидела свет. Она не привнесла значительных изменений, но постаралась сделать библиотеку лучше: 👉 Миграция dagger-android на AndroidX. Версия на Android Support Library также доступна 👉 Исправление багов инкрементальной компиляции 👉 Удаление использование не Android API из Guava 👉Breaking changes: companion object больше нельзя объявлять как @Module для Dagger Component. Добавление аннотации необходимо только на внешнем классе.
Android Architecture Components - довольно популярное решение на сегодня в Android разработке. Понимание механизмов работы его компонентов поможет эффективнее использовать его и подать идеи как реализовать другой функционал с использованием аналогичных механизмов.
В статье разбирается: 👉 ViewModelProvider 👉 ViewModelStore 👉 ViewModelStoreOwner 👉 Эволюция ViewModel: 2017, 2018, 2019 👉 Где хранится ViewModel чтобы переживать пересоздания Activity/Fragment при смене конфигурации
Не любой контент получится отобразить простым путём маппинга модели на UI. Порой описание элементов могут иметь множество полей разного типа и меняться в зависимости от типа элемента. Как же решать эту задачу?
Построить одну универсальную View и скрывать/показывать поля? Может сработать, но решение не гибкое и код станет кучей if...else. На помощь может прийти решение Server Driven UI (SDUI), когда сервер управляет тем, что показать и как. Нечто подобное HTML, но SDUI - нативное и более ограничено в возможностях.
В статье рассматривается пример реализации описания формата для SDUI и различные фреймворки, которые позволяют отображать его: Litho от Facebook, Epoxy от Airbnb и другие менее известные
Темная тема - крутая фича, но проблемным местом ее интеграции оставалось WebView, где контент отрисовывается независимо от приложения с чем адаптация этого виджета для поддержки темной темы становилась сложнее.
Следующая версия библиотеки androidx.webkit 1.2.0 (пока достигла статуса alpha01) добавляет возможности по работе с темной темой
Kotlin Flow - это реализация реактивных стримов на основе Coroutine, и естественно Android разработчики будут сравнивать ее к тому, чему уже привыкли - RxJava 2.
В статье автор проводит сравнение работы по управлению Java потоками выполнения в RxJava Obserable и Coroutine Flow, а также миграции с первого подхода на последний.
Многим приходилось сталкиваться с View не из Android SDK или AndroidX, а также писать их самостоятельно. И самое обидное порой, что разработчик может добавить множество XML атрибутов для кастомизации View, но не задокументировать их. Зачастую в таком случае единственным источником правды становится репозиторий проекта на GitHub, а то и вовсе исходник.
В статье разбирается как задокументировать атрибуты View и как это улучшит разработку.
Компания Redmadrobot запуска стажировку для Android и iOS разработчиков. Стажировка призвана не научить вас написать первое приложение под ваш смартфон, а погрузиться глубже на основе базиса знаний.
Что обещают: 👉 Самые актуальные навыки для разработчика в 2020 году 👉 Материалы из проектов Redmadrobot 👉 Две рабочие группы: iOS и Android 👉 Очные вечерние занятия на Swift/Kotlin три раза в неделю с 18:30 до 20:30 👉 Интересные и реально сложные домашние задания (мы предупредили!) 👉 Знакомство с проектными бизнес-процессами и внутренней кухней компании
До конца дойдут только самые упорные и прокаченные на новый уровень разработчики, а лучшие получат еще и предложение от Redmadrobot. Самое главное - это возможность получить знания от профессионалов своего дела.
Разработчики подходят с разных сторон в попытке оптимизировать Gradle сборку и сделать работу быстрее. В Tiki сделал довольно интересно решение - подключение только одного feature модуля с которым сейчас работает разработчик, что позволил сократить время разработки.
Как это реализовать и каким образом должны подключаться модули вы можете найти в статье.
👉 Возможность получения элемента из back stack по id элемента из графа. Используйте getBackStackEntry 👉 Параметры в Deep Link теперь могут быть в любом порядке 👉 Появилась поддержка опциональных параметров в Deep Link 👉 Улучшение работы анимаций
Появилась возможность задавать системе, что выполняемая операция важна, и что процесс должен оставаться живым как можно дольше во время выполнения. Работает механизм поверх Foreground Service. Используйте setForegroundAsync
Также появилась возможность отображать прогресс выполнения задачи с помощью setProgressAsync
Много новых интеграций с Kotlin Coroutines: 👉 Конвертация Flow <-> LiveData 👉liveData { } - генератор значений с помощью Coroutine, которые доставляются через LiveData 👉LifecycleCoroutineScope - специальный CoroutineScope, связанный с Lifecycle. Он позволяет запускать Coroutine, когда Lifecycle достигнет определенного состояния с помощью launchWhenCreated, launchWhenResumed и launchWhenStarted 👉 suspend функции, связанные с LifecycleOwner и Lifecycle, которые позволяют дождаться заданного состояния Lifecycle: whenCreated, whenStarted, whenResumed, whenStateAtLeast (только для Lifecycle)
Но помимо этого 👉 Теперь вместо ViewModelProviders.of() надо создавать ViewModelProvider через конструктор 👉Gradle Incremental Annotation Processor: Теперь вместо аннотирования методов, который должны вызываться на методы жизненного цикла, с помощью @OnLifecycleEvent используйте DefautLifecycleObserver.