AI
prepair.app
Пройти интервью →
EnglishУкраїнськаРусский
🤖

Junior Android (Kotlin)Вопросы на собеседовании Android разработчика

Junior · без опыта / до 1 года

Собеседование Android-разработчика крутится вокруг идиом Kotlin, корутин и жизненного цикла платформы — большинство senior-вопросов на самом деле проверяют, понимаете ли вы, что процесс могут убить в любой момент. Ниже — вопросы, которые задают чаще всего, каждый с эталонным ответом. Junior: базовая теория, определения и простые практические кейсы.

Темы для подготовки

Возможности языка Kotlin
Корутины и Flow
Жизненный цикл Android
Jetpack Compose
Архитектура и DI
Room, Retrofit и тесты

9 вопросов уровня Junior с ответами

1

Как работает null safety в Kotlin и чем опасны platform types?

Ответ

Kotlin делит каждый тип на nullable (String?) и non-nullable (String), и компилятор не даёт обратиться к nullable-значению без проверки, поэтому NullPointerException в основном исчезает. Platform types появляются на границе с Java: Kotlin не знает, может ли Java-метод вернуть null, и доверяет вам. Именно оттуда NPE и приходят — аннотируйте Java-API или считайте их результат nullable в месте вызова.

2

Что дают data class и sealed class?

Ответ

Data class генерирует equals, hashCode, toString, copy и деструктуризацию по первичному конструктору, поэтому это правильный инструмент для значений, которые сравнивают и копируют, — модели API, состояние UI. Sealed class ограничивает набор наследников известным списком, поэтому when по нему исчерпывающий и компилятор укажет на забытую ветку. Вместе они чисто моделируют состояние экрана: sealed-интерфейс Loading, Content, Error, а данные несут data class.

3

Что такое структурная конкурентность в корутинах и зачем нужен scope?

Ответ

Структурная конкурентность означает, что каждая корутина принадлежит скоупу и родительской задаче, поэтому отмена родителя отменяет всех детей, а родитель не завершится, пока не завершатся они. Именно это спасает от утёкшей фоновой работы, характерной для голых потоков. В Android viewModelScope отменяется при очистке ViewModel, а lifecycleScope — при завершении жизненного цикла, так что работа останавливается, когда её результат уже некуда применить.

4

Объясните диспетчеры и что для чего используется.

Ответ

Dispatchers.Main работает на UI-потоке, там трогают вью. Dispatchers.IO — большой эластичный пул для блокирующей работы: диск, сеть, база, — потому что такие потоки в основном ждут. Dispatchers.Default размером с число ядер и предназначен для настоящих вычислений вроде парсинга или сортировки. Блокирующий вызов на Default выедает пул — это самая частая ошибка с диспетчерами.

5

В чём разница между Flow, StateFlow и LiveData?

Ответ

Flow — холодный асинхронный поток: он начинает производить значения при подписке, и у каждого подписчика своё выполнение. StateFlow горячий и всегда хранит ровно одно текущее значение, что делает его естественным для состояния UI — новый подписчик сразу получает актуальное состояние. LiveData — более старый lifecycle-aware держатель; StateFlow вместе с repeatOnLifecycle закрывает ту же задачу остальным инструментарием корутин, поэтому новый код обычно выбирает его.

6

Почему смена конфигурации пересоздаёт Activity и как это пережить?

Ответ

Поворот, тёмная тема, смена языка и размера окна уничтожают и пересоздают Activity, чтобы она подгрузила ресурсы под новую конфигурацию. Состояние, которое должно выжить, живёт во ViewModel — она переживает пересоздание. Состояние, которое должно пережить ещё и смерть процесса, идёт в SavedStateHandle, потому что систему никто не обязывает держать ваш процесс в фоне. Проверка этого пути через «Не сохранять активности» отличает надёжное приложение от того, что теряет введённые пользователем данные.

7

Что вызывает рекомпозицию в Jetpack Compose и из-за чего она тормозит?

Ответ

Compose перезапускает composable, когда меняется прочитанный им State, и пропускает те, у кого параметры равны и стабильны. Тормоза идут от нестабильных параметров — обычный List или лямбда, захватившая меняющееся значение, — они ломают пропуск и перезапускают большие поддеревья. Лечится подъёмом состояния к ближайшему общему владельцу, неизменяемыми коллекциями или аннотацией @Immutable, а также отложенным чтением через лямбды, чтобы перезапускалась только фаза layout или draw.

8

Зачем внедрение зависимостей через Hilt вместо прямого создания объектов?

Ответ

DI избавляет класс от знания о том, как собрать свои зависимости, что делает его тестируемым и держит проводку в одном месте вместо разбросанных синглтонов. Hilt генерирует граф Dagger и привязывает время жизни компонентов к андроидным: @Singleton живёт с приложением, @ViewModelScoped — с ViewModel. Практическая выгода — подменить настоящий репозиторий фейком в тестах, не трогая продакшен-код.

9

Как устроен экран с точки зрения чистой архитектуры?

Ответ

Слой UI держит Compose или View плюс ViewModel, которая отдаёт неизменяемое состояние и принимает события. Слой домена держит юзкейсы и чистые бизнес-правила без импортов Android — именно поэтому он тестируется обычным JUnit. Слой данных держит репозитории, которые выбирают между Room и Retrofit и мапят DTO в доменные модели. Важно тут направление зависимостей: домен ничего не знает ни о данных, ни об UI.

🦎

Прочитать ответы недостаточно

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

Пройти интервью Junior Android (Kotlin) →
Бесплатно · 3 интервью в месяц

Другие уровни — Android (Kotlin)

Middle Android (Kotlin)Senior Android (Kotlin)Все вопросы Android (Kotlin)

Другие специализации

🔍Junior QA Manual🤖Junior QA AutomationJunior Java Backend🐍Junior Python Backend🐘Junior PHP Backend🦫Junior Go Backend🟢Junior Node.js Backend⚛️Junior React Frontend💚Junior Vue Frontend🅰️Junior Angular Frontend