Blog about Android
-
В чём разница между remember и rememberSaveable? Когда использовать каждый?
Что делает remember remember хранит значение внутри композиции (в slot table), живёт, пока компонент находится в Composition и переживает рекомпозиции. Но значение теряется, когда: Composable вышел из дерева (ветка if выключилась, сменился экран и т.п.) или Activity/Process был уничтожен (например, поворот экрана). remember как бы говорит компилятору «помни, пока этот кусок UI живёт». Что делает…
-
Что такое State Hoisting? Почему это ключевая практика в Compose?
State hoisting в Compose — это просто поднятие состояния наверх по дереву, из дочернего @Composable в его родителя. Формула очень простая: Компонент не хранит state, а получает его «сверху» и сообщает о изменениях «наверх». И это одна из ключевых практик в Compose, потому что она обеспечивает один источник истины, повторное использование, тестируемость и предсказуемость UI.…
-
Объясни жизненный цикл Composable-функции. Когда происходит initial composition, recomposition, когда функция уходит из композиции?
Давайте разложим это без магии: у любой @Composable по сути три состояния жизни: Compose-рантайм не даёт onCreate/onDestroy, но даёт правила, по которым вызывается код и срабатывают эффекты. 1. Initial composition — первый заход функции в композицию Когда происходит: Что реально происходит при initial composition: 2. Recomposition — повторный вызов функции при изменении состояния Когда происходит:…
-
Что такое Composable-функция? Какие правила работы у неё есть?
@Composable‑функция — это специальная функция в Jetpack Compose, предназначенная для декларативного описания UI. Это функция, которая: Что делает @Composable? Основные правила и ограничения Правило Объяснение Обязательная аннотация @Composable Без неё функция не участвует в рекомпозиции и не может вызывать другие composable Имя с заглавной буквы (PascalCase) Не обязательно, но рекомендуется (Google style guide) Нет возвращаемого…
-
В чём принципиальное отличие Jetpack Compose от View-системы? Как работает рекомпозиция?
Jetpack Compose — это декларативная UI-система, принципиально отличающаяся от императивной View-системы Android. Это не просто замена TextView на Text() — это полностью другой способ мышления и рендеринга UI. Главное отличие это «Декларативность» Compose как бы говорит: «Если у тебя новый state, то перерисуй UI так, чтобы он соответствовал ему. Не важно, что было раньше.» Принципиальные…
-
Как отменяется Flow? Что происходит при отмене корутины, в которой идёт collect?
Давайте разберём всё по шагам. Что происходит, если отменить корутину, где происходит collect()? При отмене: Как Flow узнаёт, что нужно остановиться? Алгоритм проверки: Важно: flow {} должен быть cancellation-cooperative Сancellation-cooperative — означает, что внутри корутины не должно быть блокирующих элементов. Действие внутри flow Реакция на отмену корутины delay(), emit(), collect() Хорошо: прерываются автоматически. Они Сancellation-cooperative…
-
Что делает оператор collect? Можно ли вызвать его из обычной функции?
Оператор collect в Flow (и StateFlow, SharedFlow) — это терминальный оператор, без которого Flow не начнёт выполняться. Что делает collect collect — suspend-функция Это значит: ты не можешь вызвать collect() из обычной функции без suspend или coroutineScope. Почему collect — suspend? Потому что: Следовательно нужно вызывать функцию collect() из другой suspend-функции или scope.
-
В чём разница между flow{}, StateFlow, SharedFlow и Channel?
Flow {} — холодный поток StateFlow — горячий поток с состоянием SharedFlow — горячий поток для событий Channel — двусторонняя труба
-
Холодные vs горячие потоки — объясни на примерах
Разделение на холодные (cold) и горячие (hot) потоки — это одна из ключевых концепций реактивного/корутин-флоуного программирования. Холодный поток (cold) Горячий поток (hot) Когда начинается При подписке (collect()) Начинается независимо от подписчиков Повторное получение Каждый collector получает свои данные Все collectors получают одно общее событие Поведение Как фабрика: «новый клиент — новая история» Как радио: «идёт…
-
Что такое Flow? Чем отличается от Sequence и Suspend-функции?
Flow — это асинхронный стрим данных в Kotlin Coroutines, аналог Rx, но в корутинном стиле. Его важно понимать и уметь отличать от Sequence и suspend-функций. Flow<T> — это тип, представляющий ленивый асинхронный поток значений, который эмитит (emit) несколько значений во времени, при этом не блокируя поток. Ключевые свойства Flow Чем отличается от других? Сравнение suspend…
-
Расскажи про контракт между Job-ами в иерархии
Контракт между Job-ами — ключевая фича корутин, которая спасает от утечек и делает код предсказуемым. И тем самым реализует Structured Concurrency. Основной контракт (золотое правило) Job-а родительской корутины ждёт завершения всех своих дочерних корутин и дочерняя корутина не может пережить родителя. Что происходит автоматически (контракт) Ситуация Что произойдёт автоматически Родитель завершился успешно Ждёт всех детей…
-
Основные билдеры корутин? Разница между launch и async
В Kotlin Coroutines есть три основных билдера для запуска корутин: Ключевая разница между launch() и async() launch() — это fire-and-forget, возвращает Job, ошибки сразу пробрасываются вверх. async() — это «будущий результат», возвращает Deferred, ошибки откладываются и выстреливают только в момент await(). Ошибки, которые часто делают: Ошибка Почему плохо? val data = async { … }…