Android Mobile | YeaHub
487 subscribers
285 photos
21 videos
471 links
Теория, подготовка к интервью и курсы для Android разработчиков

YeaHub — это платформа для IT-специалистов, объединяющая обучение, карьерный рост, развитие и сообщество единомышленников.

Платформа: https://yeahub.ru

Для связи: @ruslan_kuyanets
Download Telegram
#полезное
😊 Jooby — лаконичный веб-фреймворк для Java и Kotlin. Этот проект предлагает минималистичный подход к созданию API — без лишних абстракций, но с поддержкой популярных серверов вроде Jetty и Netty. Инструмент универсален: один и тот же код работает как в традиционных Java-приложениях, так и в Kotlin-проектах.

Фреймворк сохраняет совместимость с существующими решениями, позволяя подключать модули для GraphQL, WebSocket или авторизации. При этом стартовый шаблон умещается в несколько строк — достаточно вызвать runApp и описать роуты.
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
1
#Собес #docker
🤔 Что такое Docker Compose?

Docker Compose - это инструмент для управления многоконтейнерными приложениями. С помощью простого YAML-файла ( docker-compose. yml ) можно настроить и запустить несколько контейнеров, определяя их сервисы, сети и тома.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
👍 Как подружить LifecycleOwner и Decompose

Некоторые API в Jetpack библиотеках принимают в качестве параметра LifecycleOwner, например, так сделано в CameraX. Однако если в вашем проекте используется Decompose, и вы используете LocalLifecycleOwner для получения текущего значения в Composable функции, то жизненный цикл будет работать некорректно: он будет соответствовать жизненному циклу Activity или Fragment, так как Decompose нигде не переопределяет этот CompositionLocal и использует собственный жизненный цикл из библиотеки Essenty.

Чтобы исправить эту проблему, необходимо сконвертировать LifecycleOwner из Decompose в его аналог из Jetpack. Однако из коробки пока что такого адаптера нет, и придётся написать его самостоятельно, по аналогии с конвертацией ЖЦ в Essenty.

В версии Decompose 3.4.0 эта проблема будет решаться проще: появится JetpackComponentContext, как отдельная зависимость, и можно будет сразу получить нужный lifecycle прямо из компонента.

Поэтому будьте внимательны при использовании CompositionLocal для работы с жизненным циклом, если навигация в проекте построена на Decompose.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
#полезное
🛞 Как встроить SwiftUI в Compose Multiplatform

Обычно я стараюсь избегать использования кастомных CompositionLocal в Compose, так как это добавляет неявные зависимости, и если не предоставить значение, приложение упадёт в рантайме. Я придерживаюсь подхода, в котором CompositionLocal можно использовать только тогда, когда значение действительно может быть полезно любой Composable-функции в дереве. Яркий пример — тема приложения.

И при работе с Compose Multiplatform я подсмотрел классное применение этого механизма для встраивания SwiftUI вьюшек в Composable функции.

1⃣ В сорсете iosMain создаём CompositionLocal и интерфейс NativeViewFactory.
2⃣ На стороне Swift реализуем этот интерфейс и передаём его в функцию создания UIViewController.
3⃣ В этой функции пробрасываем фабрику через CompositionLocalProvider.
4⃣ Далее в любом месте поддерева в iosMain можно получить доступ к этой нативной вьюшке.

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

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
#полезное
🥄 Sandwich — удобная обработка API-ответов в Kotlin. Библиотека упрощает работу с сетевыми запросами, предлагая унифицированный подход к обработке успешных ответов, ошибок и исключений. Вместо создания собственных обёрток вроде Resource или Result, разработчики могут использовать готовые компоненты с функциональными операторами.

Инструмент имеет встроенную поддержку корутин и возможность глобальной обработки ошибок через механизм операторов. Например, можно автоматически обновлять токен доступа при получении кода 401 или логировать все исключения в едином месте.
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
1
#Собес #docker
🤔 Можно ли потерять данные, если контейнер существует?

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

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
1
#полезное
😵‍💫 Jimmer — революционный ORM для JVM (Java/Kotlin), переосмысливающий работу с данными. Этот инструмент позволяет оперировать не отдельными сущностями, а целыми графами объектов любой сложности, как при чтении, так и при сохранении.

Инструмент имеет встроенную поддержку DTO с кодогенерацией, самостоятельного устранения проблемы N+1 запросов и работы с рекурсивными структурами. ORM автоматически оптимизирует SQL-запросы, убирает лишние JOIN'ы и поддерживает многоуровневое кеширование. Проект предлагает удобные DSL для запросов, интеграцию с GraphQL и работает через APT/KSP, что обеспечивает безопасность типов на этапе компиляции.
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
1
#полезное
😎 Генерация сетевых моделей

Сейчас AI используют везде, где только можно и довольно часто можно встретить в опросах, что AI применяют для преобразования JSON в сетевые модели для взаимодействия с API бэкенда. Однако эту задачу довольно легко решает OpenAPI Generator, при условии, что бэкендеры сделали нормальную документацию, конечно

Использование автогенерации моделей по спеке OpenAPI даёт сразу несколько преимуществ:
🟠 Вы не тратите время на написание бойлерплейт кода
🟠 Исключаете человеческий фактор, например, можно случайно забыть сделать поле nullable или наоборот
🟠 Всегда поддерживаете API-сущности в актуальном состоянии, так как спецификация OpenAPI напрямую связана с кодом бэкенда (ну, почти )

При этом благодаря Mustache шаблонам можно реализовать очень гибкое решение:
🔴 Использовать любую библиотеку для сериализации
🔴 Сразу маппить данные в нужные типы, например, в Instant из kotlinx-datetime
🔴 Поддерживать полиморфную сериализацию, когда ответы от API могут сильно различаться
🔴 И даже генерировать не только модели, но и код для взаимодействия с HTTP-клиентом, например, с Ktor

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
🤓 Первые примеры для Live Notification Bar в Samsung One UI 7

С примерами вида Код - Визуал
Анимации, работают из коробки. Live Notification и Now Bar уже доступны для кастомизации

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
1
#Собес #docker
🤔 Как удалить все остановленные контейнеры и неиспользуемые сети в Docker?

Для удаления всех остановленных контейнеров и неиспользуемых сетей используется команда docker system prune . Она также удаляет неиспользуемые образы и кэш.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😊 Шпаргалка по flow операторам

Внутри примеры кода с пояснением для:
🟠 map, filter, take(n)
🟠 reduce, fold, runningReduce/scan,
🟠 transform
🟠 FlatMapConcat, FlatMapMerge, FlatMapLatest
🟠 flowOn, buffer, conflate, collectLatest
🟠 zip, combine, merge
🟠 catch, onCompletion, retryWhen
🟠 onEach, debounce(timeoutMillis), distinctUntilChanged

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
❤️‍🔥 strikt — библиотека Kotlin для работы с assertion

dependencies {
testImplementation("io.strikt:strikt-core:<version>")
}


Strikt — это библиотека Kotlin для работы с assertion в тестах;
предназначена для использования с такими компонентами как JUnit, Minutest, Spek или KotlinTest.

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

GitHub
Доки

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
#полезное
👋 Landscapist — высокооптимизированная библиотека Kotlin для загрузки изображений

Landscapist обеспечивает загрузку и отрисовку изображений с помощью 3 компонентов: Glide, Coil и Fresco.
Landscapist поддерживает отслеживание состояний загрузки изображений.
Библиотека также предоставляет разные удобные анимации, включая кроссфейды, трансформации размытия и многие другие.

А ещё Landscapist позволяет гибко управлять загрузкой изображений с помощью массы плагинов

GitHub
Доки

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
2
#Собес #docker
🤔 Как удалить Docker-контейнер?

Чтобы удалить Docker-контейнер, используйте команду docker rm c указанием ID или имени контейнера. Пример: docker rm mycontainer удаляет контейнер с именем mycontainer .

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
👨‍💻 Mordant — библиотека для стилизации текста в терминале. Этот мультиплатформенный Kotlin-проект превращает скучный терминальный вывод в визуально приятные интерфейсы. С ним можно не просто раскрашивать текст, но и создавать таблицы, анимированные прогресс-бары и даже рендерить Markdown прямо в консоли.

Инструмент умеет автоматически определять возможности терминала и поддерживает корутины для анимаций. Под капотом: умная система виджетов для компоновки элементов и кросс-платформенная работа на JVM, JS и Native.
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
#статьи
😎 Хроника изменений API фоновой работы в Android

Начнём пожалуй со свежого.

Довольно подробная статья про то, как менялись инструменты для фоновой работы в Android: Service, AlarmManager, Doze Mode, JobScheduler и т.д.
Читать

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
1
#статьи
🤓 Эффекты в Jetpack Compose, лежащие на поверхности

Полезная статья про то, как реализовать универсальное решение, которое умеет накладывать различные эффекты(blur, magnifier) поверх готового контента в Jetpack Compose.
Читать

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
1
#Собес #android
🤔 В чём различие между явным (explicit) и неявным (implicit) Intent?

Явный Intent указывает точный компонент (имя пакета и класса) для запуска, а неявный содержит только действие ( action ), категорию и/или данные, система сама выбирает подходящий компонент через intent-filter. Явные используют для внутренних переходов в своём приложении, неявные - для взаимодействия с другими приложениями (открыть браузер, поделиться текстом).

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM