Рубрика: Coroutines

  • Как отменяется 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 { … }…

  • Как работают suspend функции?

    Suspend — это просто маркер на уровне компилятора Kotlin. Он как бы говорит: «Эта функция может приостанавливаться, но при этом оставаться в том же потоке». На уровне JVM-кода suspend-функция превращается в обычный метод с дополнительным параметром Continuation<T> и возвращает Any?. Что такое Continuation? Continuation<T> — это объект-колбэк, который как бы говорит: «Когда операция закончится —…

  • Что такое Coroutine Dispatchers? Какие виды есть?

    Coroutine Dispatchers — это механизм, управляющий тем, на каком(-их) потоке(-ах) или в каком пуле будет выполняться корутина. Dispatcher — это часть контекста корутины (CoroutineContext), элемент CoroutineContext.Element, задающий CoroutineDispatcher. Если при запуске корутины не задан явный dispatcher, используется контекст родителя или Dispatchers.Default Основные виды встроенных Dispatcher‑ов:

  • Что такое Coroutine Context?

    CoroutineContext — это набор объектов, определяющих поведение корутины. Он лежит в основе работы всех корутин и определяет: Структура CoroutineContext «Под капотом» CoroutineContext — это интерфейс, реализующий нечто вроде иммутабельного Map<Key, Element>. Он устроен как цепочка Element-ов. Каждый Element — это одна часть контекста: Все они реализуют CoroutineContext.Element, и каждый имеет свой Key

  • Зачем нужен Job? Что такое SupervisorJob?

    Job — это объект—дескриптор для корутины, который управляет её жизненным циклом. Job производная от CoroutineContext, которую мы вставлять в CoroutineScope. Job позволяет: Для лучшего запоминания суть работы Job-а, можно сравнить с номером заказа в ресторане. По не нему можно проверить, готов ли заказ, можно отменить или получить заказ. Все дочерние Job автоматически привязываются к родителю.…

  • Что такое CoroutineScope? Какие виды знаешь?

    CoroutineScope — это контекст выполнения корутин, объединяющая их в одну иерархию. То есть сущность, в которой происходит Структурированная асинхронность. Для легкости понимания её можно сравнить с Android Activity: наши асинхронные вызовы будут выполнятся в рамках CoroutineScope, так же как наши вьюшки(Textview, Button, LieneаrLayout и др.) существуют в рамках одной Activity. Если CoroutineScope отменяется(закрывается), то все…