TGViewer
Channel Public Channel
Android Live 🤖

Android Live 🤖

@android_live

Самые свежие новости, новинки и тренды Android от практикующего разработчика.


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

Рекламу не размещаю
Subscribers
5.12K
Photos
54
Videos
3
Links
827

Showing posts older than #919 · Back to latest

Older Posts 20 shown
Post #917 3.77K
​​Как ViewModel переживает configuration changes?
#android

Полезная статья, которая даёт базовое представление о том, как ViewModel переживает состояние при повороте экрана.

Кстати, вопросы о том, как заставить ViewModel пережить своё состояние (или же ваш кастомный класс) частенько попадаются на собеседованиях.

Да и в целом, полезно знать, какая "магия" происходит под капотом и для чего нужен ViewModelStore🙃.
  • ❤ 5
  • 👎 5
  • 👍 3
  • 🤔 1
Post #916 4.76K
​​OnBackPressed Deprecated и что использовать вместо него
#android

Если сейчас выставить targetSdk 33, то можно увидеть то, что OnBackPressed() метод в Activity — deprecated.

Это объясняется тем, что начиная с Android 10, когда была добавлена нативная поддержка навигации жестами, у пользователей были проблемы ложных срабатываний при свайпах. Получалось, что Android не мог корректно определить, был ли это просто свайп, или же пользователь действительно нажал назад.

💡Что использовать вместо onBackPressed?
Рекомендуется перейти на onBackPressedDispatcher, который надо будет зарегистрировать в Activity вместе с OnBackPressedCallback.

Вероятно, с Android 13 у пользователя немного поменяется навигация при помощи жестов, чтобы более корректно распознавать те жесты, которые он использовал.

👉 Чуть больше деталей и пример кода можно найти тут
  • 👍 18
Post #915 4.68K
​​UDF с Kotlin Flow
#kotlin

Классный пример визуализации поведения Kotlin Flow в Android.

Автор рассмотрел основные кейсы работы Flow в контексте состояний, пользовательских действий и различных типов.
Получилась крутая визуализация, что будет полезно, если вы хотите лучше разобраться с Flow 🤓
  • 👍 10
  • 🔥 2
  • ❤ 1
Post #914 4.1K
​​Зависимости в многомодульном приложении
#android

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

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

Автор использует Kotlin DSL с его более удобным синтаксисом для написания кода в gradle-файлах, и объединяет все зависимости при помощи кастомного buildSrc.

В итоге мы можем управлять зависимостями, используя только один файл, а добавлять в модуль таким образом:

implementation(Libs.Kotlin.stdlib)
implementation(Libs.AndroidX.appcompat)
implementation(Libs.AndroidX.coreKtx)
  • 👎 4
  • 🔥 4
  • 🤔 3
  • ❤ 1
Post #912 3.95K
​​Абстракция для Strings
#android

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

Автор предлагает использовать sealed-класс для обработки подобных кейсов.

sealed class TextResource {
companion object {
fun fromText(text : String) : TextResource = SimpleTextResource(text)

fun fromStringId(@StringRes id : Int) : TextResource = IdTextResource(id)

fun fromPlural(@PluralRes id: Int, pluralValue : Int) : TextResource = PluralTextResource(id, pluralValue)
}
}


Его просто применять на любых уровнях абстракции. Подробнее в этой статье.
  • 👍 9
  • 👎 3
  • 💩 3
Post #911 4.1K
​​Lifecycle of Composables in Jetpack Compose
#compose #новичкам

Довольно подробный гайд о том, что из себя представляет Jetpack Compose. Будет сильно полезно новичкам, ну и, конечно, тем, кто не особо представляет, как фреимворк работает под капотом.

Тут и:
🔸 жизненный цикл composable-функции;
🔸 обновление одной composable-функции из другой;
🔸 логирование событий;
🔸 и о том, как корректно использовать рекомпозицию.

Ну и круто, что всё построено на одном примере, который вы вместе с автором можете построить. 👌🏻
Ссылка на туториал тут.
  • 👍 11
  • 🤔 3
Post #910 3.82K
Ежегодный опрос команд российской разработки

В этом году начался ежегодный, уже шестой опрос про отечественные мобильные команды разработки. Из него можно узнать:
📖 откуда мобильщики получают новые знания;
💪 какие команды мобильной разработки самые сильные;
🌎 сколько человек решило уехать, а сколько – осталось;
🏡 сколько мобильщиков работает удаленно, а сколько – в офисе;
🌟 в каких компаниях мобильные разработчики хотят работать больше всего.

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

Не забудьте выбрать на одном из шагов также канал Android Live, для меня это очень важно 🤝.
  • 🤮 9
  • ❤ 6
  • 👍 1
Post #909 3.54K
​​App Quality Insights from Firebase Crashlytics
#android

Начиная с Android Studio Electric Eel у нас появилась возможность смотреть информацию из Crashlytics прямо внутри IDE.

Всё будет работать при помощи инструмента App Quality Insights и будет показываться стек вызовов, статистика, вызовы и всё, что мы смотрим внутри окна браузера.

Выглядит прям круто, с нетерпением жду хотя бы Beta-версии, чтобы попробовать все в деле. 🔥
  • ❤ 10
  • ❤‍🔥 9
Post #908 3.54K
​​Как устроен viewModelScope?
#android

При работе с coroutines мы частенько можем забыть отменить нужную нам джобу в тот момент, когда она нам больше не нужна. К счастью для нас, существует viewModelScope, который уничтожает ненужные coroutines в тот момент, когда уничтожается ViewModel.

❓Давайте рассмотрим чуть детальнее, как он работает внутри.
Класс ViewModel содержит внутри Map объектов, кототорые могут содержать любой тип объектов.
Нам интересен метод clear(), который вызывается перед методом onCleared() и который мы можем переопределить в нашей модели. Тут вызывается метод closeWithRuntimeException(), который как раз и завершает нужный нам Scope, так как он имплементирует интерфейс Closeable.

Подобное поведение можно было довольно просто организовать и самостоятельно, однако пришлось бы сделать кастомный Scope и завершить его в нужном нам месте. Разработчики Jetpack нам чуть-чуть упростили задачу.

Ещё больше почитать о внутренней работе ViewModel можно тут.
  • 👍 17
Post #906 3.55K
​​Screenshot tests для Compose
#compose

Тестирование при помощи скриншотов — довольно эффективный способ тестирования UI. При использовании Jetpack Compose у нас есть аннотации @Preview, которые, по сути и являются слоем для UI.

Есть библиотека Showkase, которая помогает преобразовать аннотированные методы в элементы UI для предварительного просмотра.
Автор статьи рассказывает о том, как он соединил эту либу с Screenshot testing library от Facebook.

Но он решил пойти чуть дальше и попробовал интегрировать Showkase с библиотекой Paparazzi, которая позволяет получить скриншоты приложения без физического устройства или эмулятора.

🤓 В результате у автора получилось вынести тестирование UI при помощи скриншотов на CI. Если скриншоты отличаются от тех, что были получены в новом PR, то создаётся ветка, где показывается diff между двумя ветками.
Тут автор рассказывает, как можно интегрировать подобный подход в своём приложении.
  • 👍 13
  • 👎 1
  • 🔥 1
Post #905 3.88K
​​Screen response time
#android

Одной из важных метрик, связанных со скоростью работы приложения является то, как быстро рендерятся View, да и в целом экран.
Если посмотреть на наших коллег с Web, то там это одна из ключевых метрик и существует множество полезных инструментов для того, чтобы корректно её измерить.

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

🧑‍💻Автор статьи делится своими наблюдениями по оптимизации времени рендеринга экранов приложения.

Парочку советов из статьи:

1️⃣ Делайте Inflate layout асинхронно — особенно полезный совет в сложных экранах, где создание новых View довольно затратно. Например, можно использовать AsyncLayoutInflater, а тут можно взять AsyncLayoutInflater на основе Coroutines.

2️⃣ Делайте View плоскими — достаточно распространённый совет, который позволяет уменьшить количество фаз onMeasure.

3️⃣ Ленивая инициализация объектов — инициализация объектов довольно затратный процесс, поэтому правильно настроенное создание объектов может здорово помочь сэкономить при рендеринге.

В статье можно найти ещё несколько примеров, которые реально применить для любого проекта.
  • 👍 13
  • ❤ 2
  • 👎 1
Post #903 3.02K
​​Glance Widget и Work Manager
#android

Совсем недавно Google решил переосмыслить поведение виджетов и у нас появилось новое API для их создания — Glance.
Очень круто, что всё работает в Jetpack Compose стиле, что подразумевает общее API и для виджетов, и для основных элементов экрана.

Вот неплохой пример создания виджета, где автор рассказывает то, как создать виджет со сменой изображения, используя WorkManager.

Сам API ещё в alpha, но видно, что идёт развитие и переосмысление виджетов. Правда, интересно, станут ли они снова популярными среди пользователей системы. 🤔
  • 👍 3
  • 👎 1
Post #902 3.13K
​​Spring & Fling анимации в Jetpack compose
#compose

Physics-based анимации — это тип анимаций, которые, по сравнению с обычными анимациями, дают более естественные и плавные эффекты.

В Android существует несколько разных типов подобных анимаций, и Jetpack Compose поддерживает некоторые из них.

Автор статьи рассказывает, как добавить Spring & Fling анимации в проект, сделав анимированной любую из написанных View.
  • ❤ 5
  • 👎 1
Post #900 3.4K
​​Kotlin Build Reports
#kotlin

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

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

👨‍💻 Пока что фича экспериментальная, но попробовать можно уже сейчас. Для этого надо:

1️⃣ В gradle.properties добавляем kotlin.build.report.output=file.

2️⃣ На самом деле, этого достаточно, но есть пару опциональных свойств, которые можно добавить для удобства, детальнее лучше посмотреть тут.
  • 👍 6
  • 🔥 4
  • 👎 1
Post #899 3.24K
​​Kotlin-Swift interopedia
#kmm

Полезнейшая таблица, которая показывает совместимость между методами в Kotlin и методами в Swift.
Подобная табличка есть также и в доке от Jetbrains, но лучше использовать обе.

Будет супер-полезно, если вы разрабатываете совместное API с iOS разработчиками и договариваетесь об использовании каких-то нужных вам фич.

👨‍💻 Ну и примеры кода для каждого кейса тоже очень радуют.
  • 🔥 9
  • ❤ 1
  • 🤮 1
  • 💩 1
Post #897 4.54K
​​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
Post #896 3.49K
​​Пара фич 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
Post #894 3.32K
​​Navigation в Jetpack Compose
#compose

Использование правильно настроенной навигации в приложении — очень важная вещь, которая в будущем, при росте проекта, спасает от многих проблем.
И если в привычной Android-разработке уже существует несколько различных подходов, то с появлением Jetpack Compose приходится искать другие варианты.

Тут автор очень круто сравнивает текущие подходы к навигации и пытается подобрать идеальный вариант. В сравнение попали следующие библиотеки:

👉 Navigation-compose;
👉 Compose-navigation-reimagined;
👉 Voyager;
👉 Navigator-compose;
👉 Simple-stack-compose-integration;

У каждой из них он рассмотрел плюсы и минусы, в некоторых указал, как эти минусы разрешить.

🏆 В итоге, по мнению автора, победила библиотека Voyager, которая вот-вот выйдет в релизную версию.
  • 👍 6
  • 🔥 3
  • 👎 1
Post #893 3.39K
​​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
Post #890 4.1K
​​ 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
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →