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

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

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

Для связи: @ruslan_kuyanets
Download Telegram
#ЛитКод
Задача: 649. Dota2 Senate

В мире Dota2 есть две партии: Radiant и Dire. Сенат Dota2 состоит из сенаторов, представляющих две партии. Теперь сенат хочет принять решение об изменении игры Dota2. Голосование за это изменение проходит в несколько раундов. В каждом раунде каждый сенатор может воспользоваться одним из двух прав: Запретить право одного сенатора: Сенатор может заставить другого сенатора потерять все свои права в этом и всех последующих раундах. Объявить о победе: Если этот сенатор обнаружил, что все сенаторы, у которых еще есть право голоса, принадлежат к одной партии, он может объявить о победе и принять решение об изменении игры. Дана строка senate, представляющая партийную принадлежность каждого сенатора. Символы "R" и "D" обозначают партию Лучезарных и партию Ужасных. Если сенаторов n, то размер данной строки будет равен n. Процедура голосования по кругу начинается от первого сенатора к последнему в заданном порядке. Эта процедура длится до конца голосования. Все сенаторы, потерявшие свои права, будут пропущены во время процедуры. Предположим, что каждый сенатор достаточно умен и будет играть по лучшей стратегии для своей партии. Предскажите, какая партия в итоге объявит о победе и изменит игру в Dota2. На выходе должно получиться "Radiant" или "Dire".

Пример:
Input: senate = "RD"
Output: "Radiant"


👨‍💻 Алгоритм:

1⃣Инициализируйте две очереди для хранения индексов сенаторов от партий Radiant и Dire.

2⃣Выполните цикл, пока обе очереди не станут пустыми: Сравните индексы первых сенаторов из обеих очередей. Удалите сенатора с меньшим индексом из очереди и добавьте его с индексом, увеличенным на длину строки. Удалите сенатора с большим индексом из очереди.

3⃣Если одна из очередей опустела, объявите победу партии, чья очередь еще содержит сенаторов.

😎 Решение:
fun predictPartyVictory(senate: String): String {
val radiant = ArrayDeque<Int>()
val dire = ArrayDeque<Int>()

for (i in senate.indices) {
if (senate[i] == 'R') {
radiant.add(i)
} else {
dire.add(i)
}
}

while (radiant.isNotEmpty() && dire.isNotEmpty()) {
val r = radiant.removeFirst()
val d = dire.removeFirst()
if (r < d) {
radiant.add(r + senate.length)
} else {
dire.add(d + senate.length)
}
}

return if (radiant.isEmpty()) "Dire" else "Radiant"
}


👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес
🤔 Объясните концепцию object expressions в Kotlin.

Object expressions в Kotlin позволяют создавать анонимные обьекты с определённым поведением, которые могут реализовывать интерфейсы или наследовать классы. Эти объекты полезны, когда нужно создать объект для одноразового использования, без создания отдельного именованного класса. Они делают код более компактным и выразительным.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Джун: пашет сутками и ловит кучу ошибок.

Тот самый тимлид с зп 700к в секунду:

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😊 Упрощенное тестирование ViewModel

Начиная с androidx.lifecycle:lifecycle-viewmodel-testing:2.9.0-alpha01 нам доступна структура ViewModelScenario для проверки того как ViewModel переживает реконфигурацию или восстановление состояния. Пример:

class MyViewModelTest {

@Test
fun testStateRestoration() = runTest { // this: TestScope
viewModelScenario { // this: CreationExtras
MyViewModel(
scope = this@runTest,
handle = createSavedStateHandle(),
)
}.use { scenario: ViewModelScenario ->
// Устанавливаем `ViewModel` state.
scenario.recreate()
// Проверяем что state восстановился корректно
}
}
}

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#статьи
🏕 Pисуем аватарки на карте

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

В статье автор рассматривает, как загрузить изображение через Coil и отобразить его на карте при помощи SDK для Yandex MapKit.
Читать статью

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
#Собес
🤔 Что такое корутины в Kotlin?

Корутины в Kotlin - это механизм для асинхронного программирования, который позволяет писать код, как обычный последовательный, но с возможностью приостановки и возобновления выполнения без блокировки потока. Они упрощают работу с параллельными задачами и позволяют выполнять асинхронные операции в удобной и структурированной форме.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
#полезное
🤯 Генерим любое мобильное приложение за пару кликов

Cursor может синхронинизироваться как с Xcode, так и Android Studio. Нужен только интернет, ноут и всего ОДИН промпт.

Разработчик пошагово показал весь процесс на видосе — он создал софт для медитации без единой строки кода.
Гайд тут

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
#полезное
👍 Haze

Библиотека для Jetpack Compose и Compose Multiplatform, которая добавляет эффект размытия фона!
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
#полезное
😊 Realm-kotlin

SDK для Kotlin Multiplatform и Android, который используется для работы с мобильной базой данных Realm!

🟠 Этот инструмент позволяет эффективно хранить данные в офлайн-режиме и синхронизировать их с Realm Atlas. SDK поддерживает объектно-ориентированные модели данных, асинхронные обновления с использованием корутин и отслеживание изменений данных в реальном времени. Он разработан так, чтобы минимизировать потребление ресурсов.
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
#Собес
🤔 Объясните концепцию перегрузки операторов в Kotlin.

Перегрузка операторов в Kotlin позволяет определять, как операторы (например, + , -, *) работают с пользовательскими классами. Для этого используется модификатор operator перед функцией, которая описывает поведение оператора. Это улучшает читаемость кода и делает пользовательские классы более интуитивными в использовании.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
🫡 Опасности добавления permission READ_MEDIA_IMAGES

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

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👎1
#статьи
😴 Task.sleep() и Task.yield()

В Swift Concurrency мы можем использовать Task.sleep() и Task.yield(), чтобы перевести конкретную задачу в режим ожидания или приостановки в течение определённого периода времени. Оба они выглядят и ведут себя одинаково, но есть несколько существенных различий, о которых следует знать Swift-разработчикам.

Зная эти различия, вы сможете лучше понять, когда и как использовать те или иные функции, а также оптимизировать свой код соответствующим образом. Прежде чем перейти к рассмотрению различий, автор сначала объясняет, что делают эти модификаторы.
Читать статью

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😊 Руководство по использованию unsafe

В этой статье автор рассматривает различные подходы для работы с небезопасными операциями в Swift. Swift предоставляет несколько способов для работы с указателями и низкоуровневой памятью:

🟠 Прямое использование указателей без обёрток,

🟠 Применение встроенных обёрток (например, UnsafePointer, UnsafeMutablePointer, UnsafeRawPointer, с их вариациями)

🟠 Дополнительные механизмы вроде withUnsafePointer, withUnsafeMutablePointer, Unmanaged и OpaquePointer.
Читать статью

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес
🤔 Какова цель функции withContext() в Kotlin корутинах?

Функция withContext() в Kotlin корутинах используется для смены контекста выполнения корутины на другой диспетчер. Она позволяет выполнить код в другом потоке (например, для операций с сетью или ввода/вывода) без блокировки текущего потока.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
This media is not supported in your browser
VIEW IN TELEGRAM
#полезное
😅 Telephoto

Это инструмент для Android-разработчиков, позволяющий упростить работу с мультимедиа, предоставляя компоненты, такие как масштабируемые изображения с поддержкой жестов панорамирования и масштабирования!

🟠 Основные функции включают ZoomableImage — замену стандартного Image() с поддержкой работы с большими изображениями благодаря автоматической субдискретизации, и модификатор Modifier.zoomable(), который можно использовать для создания жестов с другими элементами интерфейса.
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#статьи
🏕 Процесс локализации для Android-приложения

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

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

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
🥺 miuix

Библиотека компонентов пользовательского интерфейса для Kotlin Multiplatform, разработанная для создания кроссплатформенных приложений.

🚩 Библиотека использует Compose Multiplatform для обеспечения единой кодовой базы, поддерживая Android, iOS, macOS, Web и JVM. Она включает компоненты, такие как кнопки, списки и другие UI-элементы, что упрощает создание адаптивных интерфейсов, не требуя дублирования кода для каждой платформы.
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес
🤔 Как обрабатывать исключения в Kotlin корутинах?

В Kotlin корутинах исключения обрабатываются с помощью блоков try-catch внутри самой корутины или в коде, который её вызывает. Если исключение не поймано в корутине, оно будет передано в вызывающий код.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😊 akkurate

Библиотека для валидации данных в приложениях на Kotlin!

Основные возможности

🟠 Проверка данных на соответствие определённым ограничениям.

🟠 Поддержка пользовательских ограничений и аннотаций для удобной валидации.

🟠 Трансформация данных перед их проверкой.
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
🤓 Представим, что вы хотите реализовать список сессий конференции и разделить их по дате. Кажется, что реализация такой UI-модели будет довольно удачной идеей:


data class SessionsUiModel(
val sessionGroups: Map<String, List<Session>>
)


В Android это будет работать отлично, так как функция mapOf создает LinkedHashMap, который сохраняет порядок вставки элементов. И на самом деле все будет точно так же работать, если в iOS используется Compose Multiplatform. Однако если UI будет нативным на каждой платформе, то вы столкнетесь с проблемой.

При интеропе Kotlin-кода в Objective-C ваш Map превратится в NSDictionary (или Dictionary в Swift), который не гарантирует порядок вставки элементов.

Таким образом, не стоит полагаться на порядок элементов в Map, так как этот интерфейс не может гарантировать его. Предпочитайте использовать списки в UI-моделях, чтобы обеспечить одинаковое поведение на всех платформах:


data class SessionsUiModel(
val sessions: List<SessionItem>
)

sealed interface SessionItem {
data class Header(val header: String) : SessionItem
data class Item(val session: Session) : SessionItem
}


Если тема отличий в поведении между платформами в KMP интересна, то ставьте реакции и сделаю еще посты по теме.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
👍 AssertK

Это библиотека для выполнения утверждений (assertions) в тестах на Kotlin!

✔️ Библиотека вдохновлена AssertJ, но разработана специально для Kotlin, что позволяет использовать преимущества языка, включая методы расширения (extension methods). Это упрощает создание пользовательских утверждений и делает код тестов более лаконичным и читаемым.

✔️ AssertK поддерживает многоплатформенную разработку, работая с JVM, JS и Native. Основной подход заключается в использовании функции assertThat() для обёртки значения и вызова методов утверждений. Например, можно проверять равенство, неравенство, длину строки, свойства объектов и многое другое.
Гитхаб

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