Koin 3.2 - New DSL
#koin
Тут совсем недавно вышло крутое обновление библиотеки Koin, которое позволяет гораздо проще настраивать сам Koin — Constructor DSL.
Раньше типичный модуль в Koin выглядел следующим образом:
Как видно, в
В новой же версии мы получаем более удобную структуру:
То есть теперь все вызовы get() останутся в прошлом, и мы получим гораздо более красивый и читаемый код.
Больше примеров кода и инфа о других изменениях по ссылке.
#koin
Тут совсем недавно вышло крутое обновление библиотеки Koin, которое позволяет гораздо проще настраивать сам Koin — Constructor DSL.
Раньше типичный модуль в Koin выглядел следующим образом:
class MyClassA()
class MyClassB(val a : MyClassA)
// Let Koin find dependencies for you with get()
module {
single { MyClassA() }
single { MyClassB(get()) }
}
Как видно, в
MyClassB
нужно добавить get() по количеству параметров, которые в этот класс передаются. Если таких параметров будет много, то и число этих get() будет кратно увеличиваться. В новой же версии мы получаем более удобную структуру:
class MyClassA(val id : String)
module {
singleOf(::MyClassA)
}
// in calling code
val classA : MyClassA by inject { parametersOf("_id_")}
То есть теперь все вызовы get() останутся в прошлом, и мы получим гораздо более красивый и читаемый код.
Больше примеров кода и инфа о других изменениях по ссылке.
👍20❤2
Kotlin Contracts
#kotlin
Не очень часто используемой, но интересной и полезной фичей являются
Основная цель контрактов — помочь компилятору Kotlin в анализе кода в случаях, когда разработчик знает о коде больше деталей, чем может увидеть компилятор.
Вообще копилятор делает много крутых оптимизаций и проверок, однако порой он ведёт себя слишком строго и разработчику приходится добавлять или какие-то костыли, или дополнительные проверки для того, чтобы скомпилировать код. Контракты как раз и позволяют сказать компилятору, что всё с кодом нормально и что разработчик понимает, что тут делается.
Я нашёл парочку примеров, где контракты могут быть полезны, ну и станет понятнее, что это вообще за фича:
- автор добавил контракт для проверки пустого списка, который может быть null;
- тут автор использует контракты для проверки лямбда-функций и при инициализации в них переменных;
Будет круто, если поделитесь своими примерами использования этой фичи в своих проектах.
#kotlin
Не очень часто используемой, но интересной и полезной фичей являются
Contracts
. Основная цель контрактов — помочь компилятору Kotlin в анализе кода в случаях, когда разработчик знает о коде больше деталей, чем может увидеть компилятор.
Вообще копилятор делает много крутых оптимизаций и проверок, однако порой он ведёт себя слишком строго и разработчику приходится добавлять или какие-то костыли, или дополнительные проверки для того, чтобы скомпилировать код. Контракты как раз и позволяют сказать компилятору, что всё с кодом нормально и что разработчик понимает, что тут делается.
Я нашёл парочку примеров, где контракты могут быть полезны, ну и станет понятнее, что это вообще за фича:
- автор добавил контракт для проверки пустого списка, который может быть null;
- тут автор использует контракты для проверки лямбда-функций и при инициализации в них переменных;
Будет круто, если поделитесь своими примерами использования этой фичи в своих проектах.
👍14💩1
Gradle version catalogs
#gradle
Если ваш проект состоит из одного модуля, то управление зависимостями — довольно простая задача. Но как только вы переходите на многомодульность, то всё становится несколько сложнее.
Есть несколько вариантов решения этой задачи:
1️⃣ Управлять вручную — в каждом из модулей у вас будут повторяться те библиотеки, которые вы добавляете. Думаю, что нет смысла говорить, что этот подход не очень хороший.
2️⃣ Блок ext — подход, которым часто пользуется сам Google, и который как раз решает проблему из первого пункта. Правда в таком случае нет автозаполнения кода при написании.
3️⃣ buildSrc — можно использовать специальный gradle-модуль, где как раз и описать эти зависимости.
Но есть ещё один, менее известный, но очень удобный подход — это Version Catalogs. Он доступен в версии Gradle 7.4, и очень удобно описывает все зависимости проекта.
Подробная инструкция с тем, как всё добавить к себе тут.
Android Studio поддерживает этот формат файлов, а ещё есть плагин, который перенесёт задачу обновления компонентов на CI. 🤓
#gradle
Если ваш проект состоит из одного модуля, то управление зависимостями — довольно простая задача. Но как только вы переходите на многомодульность, то всё становится несколько сложнее.
Есть несколько вариантов решения этой задачи:
1️⃣ Управлять вручную — в каждом из модулей у вас будут повторяться те библиотеки, которые вы добавляете. Думаю, что нет смысла говорить, что этот подход не очень хороший.
2️⃣ Блок ext — подход, которым часто пользуется сам Google, и который как раз решает проблему из первого пункта. Правда в таком случае нет автозаполнения кода при написании.
3️⃣ buildSrc — можно использовать специальный gradle-модуль, где как раз и описать эти зависимости.
Но есть ещё один, менее известный, но очень удобный подход — это Version Catalogs. Он доступен в версии Gradle 7.4, и очень удобно описывает все зависимости проекта.
Подробная инструкция с тем, как всё добавить к себе тут.
Android Studio поддерживает этот формат файлов, а ещё есть плагин, который перенесёт задачу обновления компонентов на CI. 🤓
❤10💩1
Тесты для уведомлений
#android #tests
Попалась любопытная статья, где описывается хороший кейс для тестирования уведомлений в Android.
Вообще, если в проекте и пишутся тесты, то нотификациям уделяется совсем мало внимания: иногда создаётся интерфейс, который мОкается в тестах, но который при этом не имеет отношения непосредственно к показу этих уведомлений.
Автор делится своим опытом, как корректно подключить NotificationManager, как проверить, какое действие выполнилось при открытии пуша, и показывает в реальном приложении написанные для уведомлений тесты.
#android #tests
Попалась любопытная статья, где описывается хороший кейс для тестирования уведомлений в Android.
Вообще, если в проекте и пишутся тесты, то нотификациям уделяется совсем мало внимания: иногда создаётся интерфейс, который мОкается в тестах, но который при этом не имеет отношения непосредственно к показу этих уведомлений.
Автор делится своим опытом, как корректно подключить NotificationManager, как проверить, какое действие выполнилось при открытии пуша, и показывает в реальном приложении написанные для уведомлений тесты.
👍14👎2
Material You в Jetpack Compose
#design #compose
Не так давно в Android появилась фича, которая позволяет адаптировать темы приложения под цвета пользовательского интерфейса.
То есть теперь у пользователя, в теории, может быть не только светлая и тёмная темы, но и множество вариантов, в зависимости от преобладающего цвета в его обоях.
Попалась любопытная статья, где автор применяет библиотеку
Тут можно подсмотреть, как лучше хранить цвета и ресурсы для тем в Compose, как лучше сделать динамические темы, да и то, как начать переезд на эту фичу в своём приложении.
Выглядит здорово, надеюсь на поддержку этой фичи в основных приложениях.
#design #compose
Не так давно в Android появилась фича, которая позволяет адаптировать темы приложения под цвета пользовательского интерфейса.
То есть теперь у пользователя, в теории, может быть не только светлая и тёмная темы, но и множество вариантов, в зависимости от преобладающего цвета в его обоях.
Попалась любопытная статья, где автор применяет библиотеку
Material Design 3
к своему небольшому приложению, написанному на Compose. Тут можно подсмотреть, как лучше хранить цвета и ресурсы для тем в Compose, как лучше сделать динамические темы, да и то, как начать переезд на эту фичу в своём приложении.
Выглядит здорово, надеюсь на поддержку этой фичи в основных приложениях.
❤6👍3👎1
Как мы уменьшили ANR в 3 раза
#android
Ошибка "Приложение не отвечает" — весьма неприятное событие для пользователя, ведь в этом случае он вынужден закрывать приложение и делать незавершённое действие с начала.
Кроме этого, эти ошибки довольно непросто повторить и поправить, ведь они могут то появляться, то исчезать, а также иметь зависимость от устройств.
Вот неплохая статья, которая описывает то, откуда вообще появляются ANR и то, как с ними бороться.
Автор говорит, что они ощутимо снизили процент этих ошибок в своём приложении, а также значительно улучшили время старта приложения.
#android
Ошибка "Приложение не отвечает" — весьма неприятное событие для пользователя, ведь в этом случае он вынужден закрывать приложение и делать незавершённое действие с начала.
Кроме этого, эти ошибки довольно непросто повторить и поправить, ведь они могут то появляться, то исчезать, а также иметь зависимость от устройств.
Вот неплохая статья, которая описывает то, откуда вообще появляются ANR и то, как с ними бороться.
Автор говорит, что они ощутимо снизили процент этих ошибок в своём приложении, а также значительно улучшили время старта приложения.
👍8👎3❤1
Parallax Effect в Jetpack Compose
#compose
Попалась красивая реализация эффекта параллакса, которая написана на Jetpack Compose.
Не уверен на 100%, что вам есть где использовать этот эффект в приложении, но любопытно посмотреть на саму реализацию. Тем более, на столь популярном в последнее время Compose.
Автор добавил немного модификаторов для тени и карточки. В итоге получился приятный и красивый эффект.
Чуть больше деталей реализации, ну и, конечно, примеры кода можно найти тут. 🤓
#compose
Попалась красивая реализация эффекта параллакса, которая написана на Jetpack Compose.
Не уверен на 100%, что вам есть где использовать этот эффект в приложении, но любопытно посмотреть на саму реализацию. Тем более, на столь популярном в последнее время Compose.
@Composable
элементы меняют своё положение на основе ориентации устройства и приходящих данных с SensorManager
. Далее, создаётся DisposableEffect
, который используется для репозиционирования Image
.Автор добавил немного модификаторов для тени и карточки. В итоге получился приятный и красивый эффект.
Чуть больше деталей реализации, ну и, конечно, примеры кода можно найти тут. 🤓
👍9👎1
How to write the best Usecase/Interactors ever!
#android
Попалась на глаза неплохая статья, которая рассказывает о принципах написания корректных
ℹ️ Вообще
🤔 Автор рассказывает о том, как лучше сделать базовый класс для ваших
🖖 Идея с
#android
Попалась на глаза неплохая статья, которая рассказывает о принципах написания корректных
UseCases
. Если вы совсем не знакомы с тем, что это за слой архитектуры, то стоит ознакомиться с этой статьёй. ℹ️ Вообще
UseCase
— весьма полезный класс, который сильно облегчает взаимодействие между Repository
и ViewModel
. Правда, существует много разных подходов, связанных с корректным управлением жизненным циклом этого UseCase
.🤔 Автор рассказывает о том, как лучше сделать базовый класс для ваших
UseCase
, а также как с наименьшим количеством повторяющегося кода запускать, показывать индикатор загрузки и отменять запущенные UseCase
. 🖖 Идея с
CoroutinesUseCaseRunner
удобная, так что рекомендую попробовать подобный подход в своих проектах.👍11❤1
Жизнь в ОАЭ
#интервью #экспаты
Давненько на канале не выходили интервью с разработчиками, которые переехали жить и работать в другие страны.
Думаю большинство из вас видели анонс про ОАЭ. Но, виноват. Сильно задержал публикацию, хотя само интервью уже было готово.
Однако теперь всё отредактировано и его уже можно почитать тут. В комментариях можете задавать дополнительные вопросы автору, если они появятся.
Кстати, Антон тоже ведёт свой Telegram канал как раз про жизнь в Дубае, так что подписывайтесь, если вам интересна эта тема. 🇦🇪
Ну и до следующих анонсов новых стран, уже есть парочку идей😉
#интервью #экспаты
Давненько на канале не выходили интервью с разработчиками, которые переехали жить и работать в другие страны.
Думаю большинство из вас видели анонс про ОАЭ. Но, виноват. Сильно задержал публикацию, хотя само интервью уже было готово.
Однако теперь всё отредактировано и его уже можно почитать тут. В комментариях можете задавать дополнительные вопросы автору, если они появятся.
Кстати, Антон тоже ведёт свой Telegram канал как раз про жизнь в Дубае, так что подписывайтесь, если вам интересна эта тема. 🇦🇪
Ну и до следующих анонсов новых стран, уже есть парочку идей😉
Medium
Жизнь разработчика в ОАЭ, Дубай
Наш гость — Антон Дудаков, который сейчас живёт в ОАЭ, Дубай, а работает в стартапе Ziina Android-разработчиком. В этой статье он ответит…
🔥13❤3👎2👍1
KotlinDL 0.4
#kotlin
Оказывается, существует библиотека для машинного обучения от JetBrains, которая, конечно же, написана на Kotlin, и уже предлагает довольно много всяких плюшек.
❓Что же появилось в новой версии?
1️⃣ Pose Detection — появилась возможность определения положения тела человека по 17 ключевым точкам на суставах человека.
2️⃣ NoTop модели — представляют из себя более облегчённые классические модели и нужны для более тонкой настройки обучения. Добавился прям целый список этих моделей, что делает работу с библиотекой ещё более удобной.
3️⃣ Новые модели: EfficientDet и EfficientNet.
4️⃣ Добавлено парочку callbacks, что также повышает работу с моделями.
5️⃣ Изменения в Image Preprocessing DSL: удалили
Я не эксперт по ML, но очень радует, что эта сфера развивается и становится всё более популярной. И особенно радует, что у нас развивается ещё одна библиотека для работы с машинным обучением.
👨💻 Подробнее про новинки и больше примеров кода можно почитать тут.
#kotlin
Оказывается, существует библиотека для машинного обучения от JetBrains, которая, конечно же, написана на Kotlin, и уже предлагает довольно много всяких плюшек.
❓Что же появилось в новой версии?
1️⃣ Pose Detection — появилась возможность определения положения тела человека по 17 ключевым точкам на суставах человека.
2️⃣ NoTop модели — представляют из себя более облегчённые классические модели и нужны для более тонкой настройки обучения. Добавился прям целый список этих моделей, что делает работу с библиотекой ещё более удобной.
3️⃣ Новые модели: EfficientDet и EfficientNet.
4️⃣ Добавлено парочку callbacks, что также повышает работу с моделями.
5️⃣ Изменения в Image Preprocessing DSL: удалили
CustomPreprocessor
, добавили несколько Preprocessors
.Я не эксперт по ML, но очень радует, что эта сфера развивается и становится всё более популярной. И особенно радует, что у нас развивается ещё одна библиотека для работы с машинным обучением.
👨💻 Подробнее про новинки и больше примеров кода можно почитать тут.
🔥6👍2👎1
App Shortcuts в Android
#android
Вероятно, каждый из нас встречал shortcuts при использовании таких приложений, как WhatsApp, Facebook, Google Chrome. Весьма полезная штука, если вы хотите сделать какую-то быструю навигацию внутри приложения не заставляя пользователя заходить в само приложение.
❓Как её сделать?
На самом деле, всё довольно просто: необходимо добавить пару конфигурационных файлов.
1️⃣ Создаём файл
2️⃣ Добавляем непосредственно
3️⃣ Добавляем
А если вдруг вам нужно сделать динамические shortcuts, то всегда есть возможность воспользоваться
Чуть больше информации и примеры кода можно найти в этой статье.
#android
Вероятно, каждый из нас встречал shortcuts при использовании таких приложений, как WhatsApp, Facebook, Google Chrome. Весьма полезная штука, если вы хотите сделать какую-то быструю навигацию внутри приложения не заставляя пользователя заходить в само приложение.
❓Как её сделать?
На самом деле, всё довольно просто: необходимо добавить пару конфигурационных файлов.
1️⃣ Создаём файл
shortcuts.xml
внутри файлов с ресурсами2️⃣ Добавляем непосредственно
</shortcut>
внутри этого файла, где создаём его идентификатор и label. Внутри тэга переопределяем тот Intent
, который хотим запустить при клике.3️⃣ Добавляем
<meta-data android:name="android.app.shortcuts"
внутри AndroidManifest.xml
, чтобы всё заработало. А если вдруг вам нужно сделать динамические shortcuts, то всегда есть возможность воспользоваться
ShortcutManager
. Чуть больше информации и примеры кода можно найти в этой статье.
👍6🔥3👎1
Navigation в Jetpack Compose
#compose
Использование правильно настроенной навигации в приложении — очень важная вещь, которая в будущем, при росте проекта, спасает от многих проблем.
И если в привычной Android-разработке уже существует несколько различных подходов, то с появлением Jetpack Compose приходится искать другие варианты.
Тут автор очень круто сравнивает текущие подходы к навигации и пытается подобрать идеальный вариант. В сравнение попали следующие библиотеки:
👉 Navigation-compose;
👉 Compose-navigation-reimagined;
👉 Voyager;
👉 Navigator-compose;
👉 Simple-stack-compose-integration;
У каждой из них он рассмотрел плюсы и минусы, в некоторых указал, как эти минусы разрешить.
🏆 В итоге, по мнению автора, победила библиотека Voyager, которая вот-вот выйдет в релизную версию.
#compose
Использование правильно настроенной навигации в приложении — очень важная вещь, которая в будущем, при росте проекта, спасает от многих проблем.
И если в привычной Android-разработке уже существует несколько различных подходов, то с появлением Jetpack Compose приходится искать другие варианты.
Тут автор очень круто сравнивает текущие подходы к навигации и пытается подобрать идеальный вариант. В сравнение попали следующие библиотеки:
👉 Navigation-compose;
👉 Compose-navigation-reimagined;
👉 Voyager;
👉 Navigator-compose;
👉 Simple-stack-compose-integration;
У каждой из них он рассмотрел плюсы и минусы, в некоторых указал, как эти минусы разрешить.
🏆 В итоге, по мнению автора, победила библиотека Voyager, которая вот-вот выйдет в релизную версию.
👍6🔥3👎1
Пара фич Android Studio
#android
Периодически попадаются статьи, которые рассказывают о редких, но довольно полезных фичах Android Studio, которые здорово экономят время. Да, чаще это весьма очевидные советы, но автор этой статьи удивил и порадовал нестандартными решениями.
1️⃣ Прячем ненужные файлы. При использовании библиотек, генерирующих много кода (например, Dagger) можно исключить эти файлы из поиска Android Studio при помощи кастомного Scope.
Для этого переходим:
Можно пойти дальше при помощи
2️⃣ Быстрые прототипы — крутая фича, которая позволяет быстро набросать или проверить какую-то идею прямо в проекте. Для этого можно использовать Scratch files: создать новый можно при помощи Cmd + Shift + N, выбираете нужный тип файла и получаете песочницу прямо внутри текущего проекта. Попробуйте, очень удобно.
3️⃣ Множественный курсор — известная мне ранее фича, которая позволяет редактировать несколько строк проекта одновременно. Очень полезно при рефакторинге, экономит много времени.
При помощи Control + G ставится курсор между одинаковыми частями кода, а при помощи Shift + Option + click поставить курсор вообще в любую область файла.
4️⃣ Расширенный Copy/Paste — крутая штука, которая позволяет видеть историю буфера обмена. Для этого надо использовать сочетание Cmd + Shift + V.
5️⃣ Восстановление из локальной истории — часто приходится восстановить те изменения, которые уже были добавлены в файл, но ещё не залиты в Git. Это можно сделать при помощи
👉 В статье есть ещё больше советов.
#android
Периодически попадаются статьи, которые рассказывают о редких, но довольно полезных фичах Android Studio, которые здорово экономят время. Да, чаще это весьма очевидные советы, но автор этой статьи удивил и порадовал нестандартными решениями.
1️⃣ Прячем ненужные файлы. При использовании библиотек, генерирующих много кода (например, Dagger) можно исключить эти файлы из поиска Android Studio при помощи кастомного Scope.
Для этого переходим:
Preferences -> Appearance & Behaviour -> Scopes -> + -> local
и добавляем маску !file:*intermediates*/&&!file:*generated*/&&!file:R.java
.Можно пойти дальше при помощи
Preferences -> Editor -> File Types -> Ignored Files and Folders
, и скрыть из поиска целые директории, например /build, /generated, что может быть полезно в очень больших проектах.2️⃣ Быстрые прототипы — крутая фича, которая позволяет быстро набросать или проверить какую-то идею прямо в проекте. Для этого можно использовать Scratch files: создать новый можно при помощи Cmd + Shift + N, выбираете нужный тип файла и получаете песочницу прямо внутри текущего проекта. Попробуйте, очень удобно.
3️⃣ Множественный курсор — известная мне ранее фича, которая позволяет редактировать несколько строк проекта одновременно. Очень полезно при рефакторинге, экономит много времени.
При помощи Control + G ставится курсор между одинаковыми частями кода, а при помощи Shift + Option + click поставить курсор вообще в любую область файла.
4️⃣ Расширенный Copy/Paste — крутая штука, которая позволяет видеть историю буфера обмена. Для этого надо использовать сочетание Cmd + Shift + V.
5️⃣ Восстановление из локальной истории — часто приходится восстановить те изменения, которые уже были добавлены в файл, но ещё не залиты в Git. Это можно сделать при помощи
right-click -> Local History -> Show History
, где можно восстановить требуемый код.👉 В статье есть ещё больше советов.
👍18🐳11👎1🌚1
Things every Kotlin Developer should know about Coroutines
#kotlin
Попался классный набор статей, где автор делится, фактически, полной информацией о
Получился здоровский аналог документации, который поможет вникнуть в тему, ну или напомнить себе о каких-то вещах, которые забылись.
Статей целых 5️⃣:
Part 1: CoroutineContext
Part 2: CoroutineScope
Part 3: Structured Concurrency
Part 4: Exception Handling
Part 5: Cancellation
#kotlin
Попался классный набор статей, где автор делится, фактически, полной информацией о
Coroutines
, правда в структурированной и удобном для чтения виде.Получился здоровский аналог документации, который поможет вникнуть в тему, ну или напомнить себе о каких-то вещах, которые забылись.
Статей целых 5️⃣:
Part 1: CoroutineContext
Part 2: CoroutineScope
Part 3: Structured Concurrency
Part 4: Exception Handling
Part 5: Cancellation
🔥16👍3
Kotlin-Swift interopedia
#kmm
Полезнейшая таблица, которая показывает совместимость между методами в Kotlin и методами в Swift.
Подобная табличка есть также и в доке от Jetbrains, но лучше использовать обе.
Будет супер-полезно, если вы разрабатываете совместное API с iOS разработчиками и договариваетесь об использовании каких-то нужных вам фич.
👨💻 Ну и примеры кода для каждого кейса тоже очень радуют.
#kmm
Полезнейшая таблица, которая показывает совместимость между методами в Kotlin и методами в Swift.
Подобная табличка есть также и в доке от Jetbrains, но лучше использовать обе.
Будет супер-полезно, если вы разрабатываете совместное API с iOS разработчиками и договариваетесь об использовании каких-то нужных вам фич.
👨💻 Ну и примеры кода для каждого кейса тоже очень радуют.
🔥9❤1🤮1💩1
Kotlin Build Reports
#kotlin
Начиная с версии Kotlin 1.7.0 у нас появилась возможность создания отчётов о сборке. Там содержится информация о различных этапах сборки, а также почему невозможно использовать инкрементную компиляцию.
Штука крайне полезная, и её можно использовать, чтобы разобраться, почему сборка занимает так много времени.
👨💻 Пока что фича экспериментальная, но попробовать можно уже сейчас. Для этого надо:
1️⃣ В
2️⃣ На самом деле, этого достаточно, но есть пару опциональных свойств, которые можно добавить для удобства, детальнее лучше посмотреть тут.
#kotlin
Начиная с версии Kotlin 1.7.0 у нас появилась возможность создания отчётов о сборке. Там содержится информация о различных этапах сборки, а также почему невозможно использовать инкрементную компиляцию.
Штука крайне полезная, и её можно использовать, чтобы разобраться, почему сборка занимает так много времени.
👨💻 Пока что фича экспериментальная, но попробовать можно уже сейчас. Для этого надо:
1️⃣ В
gradle.properties
добавляем kotlin.build.report.output=file. 2️⃣ На самом деле, этого достаточно, но есть пару опциональных свойств, которые можно добавить для удобства, детальнее лучше посмотреть тут.
👍6🔥4👎1
Spring & Fling анимации в Jetpack compose
#compose
Physics-based анимации — это тип анимаций, которые, по сравнению с обычными анимациями, дают более естественные и плавные эффекты.
В Android существует несколько разных типов подобных анимаций, и Jetpack Compose поддерживает некоторые из них.
Автор статьи рассказывает, как добавить Spring & Fling анимации в проект, сделав анимированной любую из написанных
#compose
Physics-based анимации — это тип анимаций, которые, по сравнению с обычными анимациями, дают более естественные и плавные эффекты.
В Android существует несколько разных типов подобных анимаций, и Jetpack Compose поддерживает некоторые из них.
Автор статьи рассказывает, как добавить Spring & Fling анимации в проект, сделав анимированной любую из написанных
View
.❤5👎1
Glance Widget и Work Manager
#android
Совсем недавно Google решил переосмыслить поведение виджетов и у нас появилось новое API для их создания — Glance.
Очень круто, что всё работает в Jetpack Compose стиле, что подразумевает общее API и для виджетов, и для основных элементов экрана.
Вот неплохой пример создания виджета, где автор рассказывает то, как создать виджет со сменой изображения, используя WorkManager.
Сам API ещё в alpha, но видно, что идёт развитие и переосмысление виджетов. Правда, интересно, станут ли они снова популярными среди пользователей системы. 🤔
#android
Совсем недавно Google решил переосмыслить поведение виджетов и у нас появилось новое API для их создания — Glance.
Очень круто, что всё работает в Jetpack Compose стиле, что подразумевает общее API и для виджетов, и для основных элементов экрана.
Вот неплохой пример создания виджета, где автор рассказывает то, как создать виджет со сменой изображения, используя WorkManager.
Сам API ещё в alpha, но видно, что идёт развитие и переосмысление виджетов. Правда, интересно, станут ли они снова популярными среди пользователей системы. 🤔
👍3👎1
Screen response time
#android
Одной из важных метрик, связанных со скоростью работы приложения является то, как быстро рендерятся
Если посмотреть на наших коллег с Web, то там это одна из ключевых метрик и существует множество полезных инструментов для того, чтобы корректно её измерить.
С Android всё не так просто, но тем не менее есть парочку инструментов, которые могут нам помочь сделать приложения ещё более качественными.
🧑💻Автор статьи делится своими наблюдениями по оптимизации времени рендеринга экранов приложения.
Парочку советов из статьи:
1️⃣ Делайте Inflate layout асинхронно — особенно полезный совет в сложных экранах, где создание новых View довольно затратно. Например, можно использовать AsyncLayoutInflater, а тут можно взять AsyncLayoutInflater на основе Coroutines.
2️⃣ Делайте View плоскими — достаточно распространённый совет, который позволяет уменьшить количество фаз
3️⃣ Ленивая инициализация объектов — инициализация объектов довольно затратный процесс, поэтому правильно настроенное создание объектов может здорово помочь сэкономить при рендеринге.
В статье можно найти ещё несколько примеров, которые реально применить для любого проекта.
#android
Одной из важных метрик, связанных со скоростью работы приложения является то, как быстро рендерятся
View
, да и в целом экран. Если посмотреть на наших коллег с Web, то там это одна из ключевых метрик и существует множество полезных инструментов для того, чтобы корректно её измерить.
С Android всё не так просто, но тем не менее есть парочку инструментов, которые могут нам помочь сделать приложения ещё более качественными.
🧑💻Автор статьи делится своими наблюдениями по оптимизации времени рендеринга экранов приложения.
Парочку советов из статьи:
1️⃣ Делайте Inflate layout асинхронно — особенно полезный совет в сложных экранах, где создание новых View довольно затратно. Например, можно использовать AsyncLayoutInflater, а тут можно взять AsyncLayoutInflater на основе Coroutines.
2️⃣ Делайте View плоскими — достаточно распространённый совет, который позволяет уменьшить количество фаз
onMeasure
. 3️⃣ Ленивая инициализация объектов — инициализация объектов довольно затратный процесс, поэтому правильно настроенное создание объектов может здорово помочь сэкономить при рендеринге.
В статье можно найти ещё несколько примеров, которые реально применить для любого проекта.
👍13❤2👎1
Screenshot tests для Compose
#compose
Тестирование при помощи скриншотов — довольно эффективный способ тестирования UI. При использовании Jetpack Compose у нас есть аннотации
Есть библиотека Showkase, которая помогает преобразовать аннотированные методы в элементы UI для предварительного просмотра.
Автор статьи рассказывает о том, как он соединил эту либу с Screenshot testing library от Facebook.
Но он решил пойти чуть дальше и попробовал интегрировать Showkase с библиотекой Paparazzi, которая позволяет получить скриншоты приложения без физического устройства или эмулятора.
🤓 В результате у автора получилось вынести тестирование UI при помощи скриншотов на CI. Если скриншоты отличаются от тех, что были получены в новом PR, то создаётся ветка, где показывается diff между двумя ветками.
Тут автор рассказывает, как можно интегрировать подобный подход в своём приложении.
#compose
Тестирование при помощи скриншотов — довольно эффективный способ тестирования UI. При использовании Jetpack Compose у нас есть аннотации
@Preview
, которые, по сути и являются слоем для UI.Есть библиотека Showkase, которая помогает преобразовать аннотированные методы в элементы UI для предварительного просмотра.
Автор статьи рассказывает о том, как он соединил эту либу с Screenshot testing library от Facebook.
Но он решил пойти чуть дальше и попробовал интегрировать Showkase с библиотекой Paparazzi, которая позволяет получить скриншоты приложения без физического устройства или эмулятора.
🤓 В результате у автора получилось вынести тестирование UI при помощи скриншотов на CI. Если скриншоты отличаются от тех, что были получены в новом PR, то создаётся ветка, где показывается diff между двумя ветками.
Тут автор рассказывает, как можно интегрировать подобный подход в своём приложении.
👍13👎1🔥1