Android Live 🤖 – Telegram
Android Live 🤖
5.28K subscribers
52 photos
1 video
800 links
Самые свежие новости, новинки и тренды Android от практикующего разработчика.


Автор: @al_gorshkov,
Чат: @android_live_chat
Личный блог: @al_gorshkov_blog

Рекламу не размещаю
Download Telegram
​​KMM — UI State management
#kmm

Классный цикл статей, где автор рассматривает управление состоянием View при помощи архитектуры MVI, причём и на iOS и на Android при помощи KMM.

В первой статье автор рассказывает о базовых принципах MVI и вводит те понятия, которые там используются: State, Event, SideEffect, а также делает базовую инмплементацию на примере простенького приложения. Будет полезно, если вы не очень хорошо знакомы с MVI.

Вторая часть будет полезна тем, что автор показывает, как перевести уже написанное приложение из предыдущей статьи на iOS. Тут рассказывается про то, как стоит разделить код, что выбрать для слушателя событий и как пошарить уже готовую логику на iOS.

Код супер простой и понятный, что будет полезно новичкам, которые только изучают KMM. 🤓
👍10🤩3
​​Равенство объектов в Java и Kotlin
#kotlin

Попалась интересная статья, где рассматриваются отличия в работе функций проверки на равенство в двух языках.

Наиболее интересно посмотреть на кейсы, где разные подходы к проверке на равенство могут привести к плохим результатам.
Например, в Java надо быть внимательным при наследовании одного объекта от другого и их дальнейшего сравнения: в этом случае не равные по сути объекты могут оказаться равными по функции equals(). Любопытен и тот факт, что функция сравнения часто может оказаться менее производительной, чем кажется на первый взгляд.

В Kotlin было интересно посмотреть про кейс использования массивов в data-классах.

Пара выводов из этой статьи:

1️⃣ Проверьте, можно ли обойтись без переопределения функций equals/hashCode. Это может помочь в производительности сравнения функций.

2️⃣ Если надо использовать сравнение, то лучше воспользоваться data-классами. Но не стоит использовать их повсюду, ведь при это генерируется много вспомогательных функций, которые влияют на вес приложения.

3️⃣ Если не получается использовать принцип Composition over inheritance, то проверьте правильность использования функций equals в абстрактном и наследуемом классах.
👍12
​​Testing Kotlin coroutines on Android
#tests

При тестировании coroutines требуются некоторые изменения в написании тестов, ведь сами функции могут выполняться асинхронно.
Для того, чтобы лучше понять, как тестировать код с coroutines есть неплохой гайд от Google, где описываются несколько интересных моментов, которые стоит учитывать.

Для тестов нужно добавить специальную зависимость kotlinx.coroutines.test, после которой становятся доступными сразу несколько полезных функций.
Например, функция runTest позволяет обернуть существующий код на coroutines и выполнить его.

Кроме этого, добавляются тестовые Dispatchers, которые используются только в тестах. В статье описывается, какие типы существуют, а также как корректно применить их к существующему коду.
👍5👏1
​​Переменные при сборке проекта

Хотел поделиться недавно найденной фичей, которая может пригодиться, если вам надо передавать разные переменные для одного и того же билда. Штука максимально простая, но я как-то не находил и не использовал её раньше.

1️⃣ Дано: некая переменная, которая может меняться в зависимости от разных билдов.

2️⃣ Заводим эту переменную в build.gradle и прописываем ей дефолтное значение, например:
def isVariable = false

3️⃣ Дальше добавляем проверку на наличие этой переменной в свойствах, которые будем передавать в командной строке при сборке.
if (project.hasProperty('isVariable')) {
isVariable = project.property('isVariable').toBoolean()
}


Саму переменную можно прокинуть в buildConfigField для того, чтобы видеть её из кода.

4️⃣ Начинаем сборку билда и передаём нужную нам переменную. По желанию, их может быть несколько.
./gradlew assembleQaRelease -PisVariable=true.

На этом, в целом всё, может быть и эта фича будет кому-то полезна. 🤓
👍11🔥5🤔4
​​Отмена долгих операций
#coroutines #kotlin

Тут ребята из Delivery Club рассказывают о том, как правильно организовать свой код, если все длительные операции считать отменяемыми.

В качестве примера были взяты Coroutines, что здорово.
Даже если в проекте вам не обязательно делать все операции отменяемыми, автор довольно годно рассматривает различные состоятия Coroutines, какое поведение будет при отмене, если имеются дочерние задачи, да и в целом, как сделать отмену контролируемой. 👌🏻
👍121
Тут в голове родилась одна идея, но прежде реализации, хотел бы узнать:

Какие сервисы вы используете для прослушивания подкастов?
Anonymous Poll
42%
Yandex Music
10%
Apple Podcasts
29%
Google Podcasts
9%
Soundcloud
3%
Castbox
20%
Spotify
13%
Другое (напишу в комментариях)
🤮11👍3🤔3🔥1
​​Koin 3.2 - New DSL
#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() останутся в прошлом, и мы получим гораздо более красивый и читаемый код.
Больше примеров кода и инфа о других изменениях по ссылке.
👍202
​​Kotlin Contracts
#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. 🤓
10💩1
​​Тесты для уведомлений
#android #tests

Попалась любопытная статья, где описывается хороший кейс для тестирования уведомлений в Android.

Вообще, если в проекте и пишутся тесты, то нотификациям уделяется совсем мало внимания: иногда создаётся интерфейс, который мОкается в тестах, но который при этом не имеет отношения непосредственно к показу этих уведомлений.

Автор делится своим опытом, как корректно подключить NotificationManager, как проверить, какое действие выполнилось при открытии пуша, и показывает в реальном приложении написанные для уведомлений тесты.
👍14👎2
​​Material You в Jetpack Compose
#design #compose

Не так давно в Android появилась фича, которая позволяет адаптировать темы приложения под цвета пользовательского интерфейса.
То есть теперь у пользователя, в теории, может быть не только светлая и тёмная темы, но и множество вариантов, в зависимости от преобладающего цвета в его обоях.

Попалась любопытная статья, где автор применяет библиотеку Material Design 3 к своему небольшому приложению, написанному на Compose.
Тут можно подсмотреть, как лучше хранить цвета и ресурсы для тем в Compose, как лучше сделать динамические темы, да и то, как начать переезд на эту фичу в своём приложении.

Выглядит здорово, надеюсь на поддержку этой фичи в основных приложениях.
6👍3👎1
​​Как мы уменьшили ANR в 3 раза
#android

Ошибка "Приложение не отвечает" — весьма неприятное событие для пользователя, ведь в этом случае он вынужден закрывать приложение и делать незавершённое действие с начала.
Кроме этого, эти ошибки довольно непросто повторить и поправить, ведь они могут то появляться, то исчезать, а также иметь зависимость от устройств.

Вот неплохая статья, которая описывает то, откуда вообще появляются ANR и то, как с ними бороться.
Автор говорит, что они ощутимо снизили процент этих ошибок в своём приложении, а также значительно улучшили время старта приложения.
👍8👎31
​​Parallax Effect в Jetpack Compose
#compose

Попалась красивая реализация эффекта параллакса, которая написана на Jetpack Compose.
Не уверен на 100%, что вам есть где использовать этот эффект в приложении, но любопытно посмотреть на саму реализацию. Тем более, на столь популярном в последнее время Compose.

@Composable элементы меняют своё положение на основе ориентации устройства и приходящих данных с SensorManager. Далее, создаётся DisposableEffect, который используется для репозиционирования Image.

Автор добавил немного модификаторов для тени и карточки. В итоге получился приятный и красивый эффект.
Чуть больше деталей реализации, ну и, конечно, примеры кода можно найти тут. 🤓
👍9👎1
​​How to write the best Usecase/Interactors ever!
#android

Попалась на глаза неплохая статья, которая рассказывает о принципах написания корректных UseCases. Если вы совсем не знакомы с тем, что это за слой архитектуры, то стоит ознакомиться с этой статьёй.

ℹ️ ВообщеUseCase — весьма полезный класс, который сильно облегчает взаимодействие между Repository и ViewModel. Правда, существует много разных подходов, связанных с корректным управлением жизненным циклом этого UseCase.

🤔 Автор рассказывает о том, как лучше сделать базовый класс для ваших UseCase, а также как с наименьшим количеством повторяющегося кода запускать, показывать индикатор загрузки и отменять запущенные UseCase.

🖖 Идея с CoroutinesUseCaseRunner удобная, так что рекомендую попробовать подобный подход в своих проектах.
👍111
Жизнь в ОАЭ
#интервью #экспаты

Давненько на канале не выходили интервью с разработчиками, которые переехали жить и работать в другие страны.
Думаю большинство из вас видели анонс про ОАЭ. Но, виноват. Сильно задержал публикацию, хотя само интервью уже было готово.

Однако теперь всё отредактировано и его уже можно почитать тут. В комментариях можете задавать дополнительные вопросы автору, если они появятся.
Кстати, Антон тоже ведёт свой Telegram канал как раз про жизнь в Дубае, так что подписывайтесь, если вам интересна эта тема. 🇦🇪

Ну и до следующих анонсов новых стран, уже есть парочку идей😉
🔥133👎2👍1
​​ KotlinDL 0.4
#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️⃣ Создаём файл 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, которая вот-вот выйдет в релизную версию.
👍6🔥3👎1
​​Пара фич Android Studio
#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

Попался классный набор статей, где автор делится, фактически, полной информацией о 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 разработчиками и договариваетесь об использовании каких-то нужных вам фич.

👨‍💻 Ну и примеры кода для каждого кейса тоже очень радуют.
🔥91🤮1💩1