Рубрика: Coroutines
-
Можно ли на корутинах получить дедлок?
Ответ: Да, можно. Если есть корутины, которые взаимозависимы от результатов друг друга и блокируют друг друга, то дедлок возможен. Как их избежать:
-
Вопросы для Android-собесов
Приуэт! Давно ничего не писал) Это вопросы для собесов, по которым я сам готовлюсь. Список обновляется и улучшается. Также будут посты с ответами, по каждому из вопросов. Вопросы я составляю так, чтобы можно было сразу копипастнуть Гуглу или ЧатГопоте(ChatGPT) и получить более подробный ответ =) Android Kotlin Coroutines Java, JVM, JMM Collections Concurrency Architecture, general…
-
Что такое Flow
Flow — это упакованный в объект фрагмент кода, который производит какой-то последовательный набор элементов (данных). С одной стороны есть условный Отправитель, который этот код создал и готов предоставить его в виде Flow обертки. А с другой стороны есть Получатель, который возьмет этот Flow, запустит его и предоставит ему специальный колбэк, куда Flow будет складывать данные,…
-
Обработка ошибок в Корутинах
Обработка ошибок в Корутинах всегда вызывала затруднения у многих разработчиков по ряду причин. Мало того, что существует несколько способов их обработки, но в первую очередь необходимо понять механизм распространения ошибок, который идет со структурированным параллелизмом(structered concurrency). И есть множество ситуаций, когда распространение ошибок с помощью Корутин происходит по-разному, например: Ошибки, возникающие в Scope-ах с CoroutineExceptionHandler…
-
Dispatchers
DefaultЕсли корутина не находит в своем контексте диспетчер, то она использует диспетчер по умолчанию. Этот диспетчер представляет собой пул потоков. Количество потоков равно количеству ядер процессора. Он не подходит для IO операций, но сгодится для интенсивных вычислений. IOИспользует тот же пул потоков, что и диспетчер по умолчанию. Но его лимит на потоки равен 64 (или…
-
Context
Для выполнения каждой Корутины нужен CoroutineContext. А если точнее CoroutineContext-ы). А если еще точнее то компоненты наследники от класса CoroutineContext. Это необходимые компоненты, которые нужны для контроля над корутиной, переключения потоков выполнения, обработки ошибок и т.д. Но где и куда его вставлять? =) В предыдущих примерах мы уже встраивали и использовали CoroutineContext. Помните Job-у, которую…
-
Builders
Билдер launch()Начнем с билдера launch. Мы уже использовали его в прошлых уроках, чтобы создавать корутины. Но у него есть еще пара возможностей, о которых надо рассказать отдельно. В прошлом уроке мы рассматривали такой пример: Мы выяснили, что билдер launch создает и запускает корутину. Билдер не ждет, пока корутина выполнится, и не блокирует выполнение метода onRun.…
-
Scope
Scope можно в чем-то сравнить с Активити Андроида. Если весь ЮИ отрисовывается в рамках Активити и нигде больше, то также и с Корутинами. Их можно запустить в рамках Scope-а. Также и suspend-функции запускаются в рамках scope-а. По примеру борща, scope можно сравнить с тарелкой, в котором будет борщ=) Scope который отменяется за собой отменяет дочерние…
-
Continuation. Не «Магия» корутин
А теперь давайте посмотрим на то как происходит не блокирование потока и отсутствие колбэков «под капотом». Если честно, то колбэки все же есть=) Не все так просто, но и не сложно! Корутины используют специальный механизм Continuation. Continuation можно рассматривать как колбэк. Continuation — похож на огромную стейт-машину, где на каждый кусок Корутин-кода(Suspend-функции) есть свой Switch-Case.…
-
Suspend-функция
Давайте поговорим об одном из компонентов составляющих понятия Корутины Suspend-функции. Помните мы говорили о том что Корутины не блокируют поток, а приостанавливают работу кода. Ну так вот, такое свойство обеспечивает Suspend-функция. То есть, код который вписан в тело Suspend-функции при запуске не заблокирует поток, но этот код приостановит свою работу. Это означает что мы можем…