Рубрика: Coroutines
-
Расскажи про контракт между 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 отменяется(закрывается), то все…
-
Как Coroutine работают внутри, чем отличаются от потоков?
Основная идея в том, что Coroutine это НЕ(!) про многопоточность, а про асинхронность. А если быть точнее, то про Структурированную асинхроннсть. То есть мы можем выполнять код на одном потоке(даже на MainThread-e) и получать результат не блокируя поток(т.е. Асинхронно) и в том порядке(т.е. Структурированно), который описан наш асинхронный блок кода.
-
Можно ли на корутинах получить дедлок?
Ответ: Да, можно. Если есть корутины, которые взаимозависимы от результатов друг друга и блокируют друг друга, то дедлок возможен. Как их избежать:
-
Вопросы для Android-собесов
Приуэт! Давно ничего не писал) Это вопросы для собесов, по которым я сам готовлюсь. Список обновляется и улучшается. Также будут посты с ответами, по каждому из вопросов. Вопросы я составляю так, чтобы можно было сразу копипастнуть Гуглу или ЧатГопоте(ChatGPT) и получить более подробный ответ =) Android Kotlin Coroutines Coroutine Flows Jetpack Compose Collections Java, JVM,…
-
Что такое Flow
Flow — это упакованный в объект фрагмент кода, который производит какой-то последовательный набор элементов (данных). С одной стороны есть условный Отправитель, который этот код создал и готов предоставить его в виде Flow обертки. А с другой стороны есть Получатель, который возьмет этот Flow, запустит его и предоставит ему специальный колбэк, куда Flow будет складывать данные,…
-
Обработка ошибок в Корутинах
Обработка ошибок в Корутинах всегда вызывала затруднения у многих разработчиков по ряду причин. Мало того, что существует несколько способов их обработки, но в первую очередь необходимо понять механизм распространения ошибок, который идет со структурированным параллелизмом(structered concurrency). И есть множество ситуаций, когда распространение ошибок с помощью Корутин происходит по-разному, например: Ошибки, возникающие в Scope-ах с CoroutineExceptionHandler…