💰 Поддержать проект на Boosty boosty.to/androidbroadcast 🔗 Telegram канал "Android Broadcast" ttttt.me/android_broadcast 🔗 Telegram канал "Kotlin Broadcast" ttttt.me/android_broadcast
@ГуляКой Жыл бұрын
Хэ
@РозаАмидова-з9й Жыл бұрын
0
@РозаАмидова-з9й Жыл бұрын
00
@buddaset42262 жыл бұрын
Всех поздравляю с выходом данного курса. Спасибо Кириллу.
@ohhimark16272 жыл бұрын
Очень давно ждал и дождался, нужно было основательно познакомиться и изучить корутины, спасибо Кирилл!
@OleksiiBatishchev2 жыл бұрын
Огромная благодарность! Ждём новые видео) А тебе Кирилл терпения и вдохновения. Хорошее дело делаешь
@andrew39372 жыл бұрын
Спасибо большое. Ты не представляешь сколько человекочасов сэкономит этот курс. Ты герой. Как найду работу, стану патроном)
@AndroidBroadcast2 жыл бұрын
Спасибо!
@dreimhold11 ай бұрын
Ну что, уже работаешь?
@mozart37128 ай бұрын
@@dreimhold а ты? в тг списаться не хоч?
@SergeyGorban-e2c2 жыл бұрын
Ура! Дождались) Спасибо!
@dreaaaam982 жыл бұрын
Спасибо большое за данный курс. Давно ждал)
@Александр-м7о7т2 жыл бұрын
Курс 🔥 С корутинами работаю уже очень давно, но несмотря на это подметил для себя много интересных моментов
@CaptainBuldog Жыл бұрын
Спасибо за курс. Объясняешь очень доходчиво и понятно!
@lordraiden_do2 жыл бұрын
огромное спасибо! очень круто смотреть такие ролики где все разжевывается!
@dzmitreydanilau46372 жыл бұрын
Супер, спасибо за урок
@telephon3208 Жыл бұрын
кажется ты путаешь Concurrent и Asynchronous. обычно противопоставляют Sync - Async и Concurrent - Parallel. асинхронные задачи могут выполняться одновременно
@Mr1nkoGnit02 жыл бұрын
Спасибо! С нетерпением жду продолжения.
@inex5502 жыл бұрын
На одном дыхании. Всё очень круто и понятно. Спасибо! :)
@swamp21132 жыл бұрын
Не совсем понял момент с отменой корутин. 14:12 Нам ведь не нужно проверять isActive, у нас два вызова суспенд методов -- doWork и delay. Проверка на отмену проводится при каждом вызове суспенд метода и после выхода из суспенд состояния? И ещё в самом суспенд состоянии, например, если мы вызовем delay(5_000) и через 2 секунды отменим джобу, она же отменится сразу? Спасибо за видос!
@AndroidBroadcast2 жыл бұрын
Если после вызова остановки будет suspend функция, тогда да. Но если нет suspend вызовов, то лучше проверять руками. Например, считывание файла не остановится так как для него не используется suspend функции
@ИльяШелковенко2 жыл бұрын
Спасибо Кирилл, знаем что далось нелегко, поэтому поддерживаем лайками)
@learn1839 Жыл бұрын
спасибо за ваш курс, всё понятно и доступно
@morakdim59272 жыл бұрын
Огонь 🔥, как раз начал изучать корутинки.
@buslovskiy2 жыл бұрын
Спасибо за детальное и простое объяснение. Круто получилось.
@sergey300272 жыл бұрын
Спасибо, жду продолжения
@emrlord-26202 жыл бұрын
Годнота ! Спасибо за контент!
@Nihao-hi2 жыл бұрын
Спасибо за труды!
@beavissooqa75852 жыл бұрын
4:20 разве ключевое слово суспенд приостанавливает выполнение корутины?
@sergeyly54382 жыл бұрын
Похоже мне ещё рановато знать корутины 😵. Огромное спасибо за курс, уверен он многим поможет
@AndroidBroadcast2 жыл бұрын
Как минимум можно вернуться к нему позже, когда будете готовы
@zgbnb2 жыл бұрын
Миллион раз спасибо, наконец-то дождался я
@HappyGameNikit2 жыл бұрын
11:28 "Запускаются они сразу после создания" Зависит от скоупа ведь Какие-нибудь main.immediate, unconfined диспатчеры сразу запустят А так корутина и на следующий кадр может запуститься
@AndroidBroadcast2 жыл бұрын
Я имел ввидо что они не будут ждать вызова join или await
@HappyGameNikit2 жыл бұрын
@@AndroidBroadcast понимаю, это скорее просто уточнение для тех кому интересно. Спасибо за курс!)
@AndroidBroadcast2 жыл бұрын
Main immediate запустит сразу только если уже выполняется корутина из главного потока
@mikhailgureev2182 жыл бұрын
пушка-топ, спасибо большое Кирилл
@fliker23092 жыл бұрын
Ура! Очень рад, что курс наконец вышел 🙃
@september6692 жыл бұрын
Хочу добавить уточнение к 5:25 - корутина освободит поток только если она не повисла на какой-нибудь системной блокировке ( к примеру на блокирующем IO)
@whitewhisper8702 жыл бұрын
Вижу долгожданный курс - ставлю 👍
@nazirjonmakhmadkulov3712 жыл бұрын
Спасибо за курс!
@maksonic_official2 жыл бұрын
Первый урок понятно вводный, будем ждать последующие где будет больше конкретики 😊 Поздравляю с первым выпуском курса!💥💥💥
@AndroidBroadcast2 жыл бұрын
Спасибо!
@_chkMyStyle_ Жыл бұрын
Спасибо за урок!
@AndroidBroadcast Жыл бұрын
Если вам приносит пользу, то будем рад поддержке boosty.to/androidbroadcast
@zoompartyru2 жыл бұрын
Спасибо ! Отличная инфа!
@sytyluipes Жыл бұрын
Спасибо большое за урок, пока только слышал про корутины, трогаю котлин и андроид около дву недель😅
@wowus942 жыл бұрын
Спасибо!
@antonselitskiy81432 жыл бұрын
Супер, спасибо!
@antaki93 Жыл бұрын
15:00 похоже, suspend-функция в отменённых корутинах не выполняется потому, что проверка isActive происходит автоматически, перед запуском suspend-функции (как ты в самом начале и описал)
@AndroidBroadcast Жыл бұрын
Да, верно
@isqanderche30622 жыл бұрын
Отлично! Это лучшее, что я видел по этой теме на русском
@pavelgulevich26752 жыл бұрын
Хм, я не джун, вроде неплохо представляю себе как работают потоки. Познания о корутинах на уровне - "легковесный поток". После кодинг сессии в видео я ничего не понял: где начинается корутина и где заканчивается; вроде стало понятно что такое GlobalScope, но при этом не понятно как связан runBlocking со Scope; в параметрах функции runBlocking идет CoroutineScope, а мы передаем корутину, почему? как между собой связаны все эти сущности и понятия? Возможно мало времени уделено базовым понятиям корутин. В общем, после просмотра серии больше вопросов, чем ответов для себя вынес. Тем не менее, спасибо Кириллу за старания и надеюсь, что по итогу всего курса данные вопросы структурируются.
@AndroidBroadcast2 жыл бұрын
В будущих уроках про все это будет подробнее
@vasiliychernov21232 жыл бұрын
>в параметрах функции runBlocking идет CoroutineScope, а мы передаем корутину, почему? В параметрах runBlocking передаётся не CoroutineScope, а блок кода, вызываемый на нём, CoroutineScope - receiver.
@Lt-cg7cj Жыл бұрын
Спасибо) Смотрю в замедленной скорости, иначе не успеваю понимать
@Sunsets_LoFi2 жыл бұрын
Отличнейшее и всестороннее обозрение корутин. Респект🔥
@alaershov2 жыл бұрын
Отличное начало! Кажется что ты слишком сурово запрещаешь runBlocking, у него ведь есть вполне валидные кейсы использования. Например мы находимся в каком-нибудь OkHttp Interceptor и хотим подставить в запрос токен аутентификации, а наша APIшка обращения к хранилищу токена предоставляет только suspend функции. Но при этом мы уже находимся в фоновом потоке, никакой main не заблокируем. В общем, если GlobalScope не нужен действительно никогда, то у runBlocking всё-таки есть законные применения)
@AndroidBroadcast2 жыл бұрын
Да, но лучше максимально обезопасить для старта )))
@Vl-TV Жыл бұрын
причем тут suspend и лаунч 13:47 и асинк и асинкевей че означает не понятно почему назвал авей
@mikhailshirokov8464 Жыл бұрын
Я правильно понимаю, что по сути корутины работают поверх некоего EventLoop (в Android - поверх Looper, привязанного к какому-либо потоку)? Т.е. когда мы к примеру вызываем suspend-функцию delay, под капотом в очередь сообщений EventLoop кладётся с указанной задержкой тот блок кода, который идёт после delay и до вызова следующей suspend-функции в корутине?
@AndroidBroadcast Жыл бұрын
Отчасти похоже на Event Loop, но скорее они делятся все выполнение на шаги и когда происходит приостановка запоминают состояние, а потом продолжают выполнение с него. Это больше похоже на большой when где каждый элемент шаг выполнения
@mikhailshirokov8464 Жыл бұрын
@@AndroidBroadcast к примеру delay приостанавливает выполнение на заданное кол-во миллисекунд, но поток при этом не блокирует (выполнение кода асинхронно продолжается на этом же потоке; к примеру если на однопоточном диспатчере запустить 2 корутины (допустим, с помощью билдера launch), и на обеих вызывать delay с разными задержками; они будут отрабатывать "параллельно", выполняясь при этом на одном потоке). Каким образом это удаётся сделать? Возможно, какой-то цикл событий всё же под капотом используется?
@ЛюдмилаШалашова-й8ж2 жыл бұрын
Как хорошо когда мозг молодой ,детский ,,быстро все схватывает !!!! Я на второй минуте ,уже ничего не понимала,и вголовн звучали только два слова корутин и потоки ха-ха ,я сдох
@Ivan-ez6gz2 күн бұрын
Либо автор так объясняет
@olegf1692 жыл бұрын
Как называется тема для среды разработки?)
@AndroidBroadcast2 жыл бұрын
Обычно использую Darcula
@olegf1692 жыл бұрын
@@AndroidBroadcast благодарю)
@bolnoi82 жыл бұрын
Наверно забегаю вперёд, но можно ли привязать корутину к жизненому циклу объекта? Т.е. теряем ссылку на объект, корутина останавливается, гарбаж коллектор уничтожает объект. Сейчас, кажется, что из-за запущенной внутри объекта корутины, гарбаж коллектор никогда не уничтожит наш инстанс и мы получим утечку памяти.
@AndroidBroadcast2 жыл бұрын
Корутина останавливается либо через вызов cancel, либо когда CoroutineScope останавливается. Сможет связать скоуп с временем существование объекта - получить результат, но изначально идея звучит как "то что не стоит делать"
@igoremelyanov94962 жыл бұрын
Спасибо за курс! 1. Есть список всех будущих частей курса и расписание их выхода? 2. Какие ресурсы посоветуешь для глубокого изучения устройства и работы корутин под капотом?
@sergey300272 жыл бұрын
Medium, статьи Елизарова
@AndroidBroadcast2 жыл бұрын
Публично списка нет, но у меня он есть. Постараюсь привести его и выложить в Telegram канале. 2. Я делал подборку ресурсов по изучению корутин и все туда сложил telegra.ph/Kak-izuchit-Kotlin-Coroutines-04-17
@igoremelyanov94962 жыл бұрын
@@AndroidBroadcast Спасибо! Именно то, что было нужно. Пошёл присоединяться в Telegram канал.
@ninh69072 жыл бұрын
спасибо!
@v.yundin2 жыл бұрын
Кто и по каким критериям решает, что корутину нужно приостановить и выполнить что-то другое? Это происходит при io операции или может произойти при любом вызове suspend функции?
@AndroidBroadcast2 жыл бұрын
При вызове любой suspend функции происходит остановка. Корутина будет стараться максимально продолжить выполнение, если это возможно. Управляют переключением потоков Dispatcher-ы
@oleg123952 жыл бұрын
подскажите пожалуйста, а что это за конструкция val myList: List = List(100) { ...it... } что происходит в блоке кода после объявления размера листа ?
@AndroidBroadcast2 жыл бұрын
Документация - это лучший источник. kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list.html
@alexiachimov98172 жыл бұрын
Спасибо за урок, было очень интересно и познавательно, даже не смотря на то, что работаю с корутинами не первый год. На днях у меня появилась одна проблема в одном проекте, касательно взаимодействиях Rx кода с Корутинами, а точнее с runBlocking{...}. Не уверен что коменты к видео это подходящее место для таких вопросов :D . Что слышно насчёт Slack или Discord канала где можно в теории обмениваться опытом, беседовать на разные темы касающиеся Android разработки и где можно будет задавать интересующие вопросы?
@AndroidBroadcast2 жыл бұрын
Есть чатик t.me/android_broadcast_talks
@alexiachimov98172 жыл бұрын
@@AndroidBroadcast что то забыл о нём, спасибо, обязательно зайду в этот чат!
@AndroidBroadcast2 жыл бұрын
Напишите на kirill@androidbroadcast.dev все подробности о блокировке и ваш аккаунт в TG
@АлександрПальчевский-ж2ф2 жыл бұрын
Спасибо
@sethwillen2272 жыл бұрын
Подскажите, пожалуйста, какая тема в идее стоит?
@AndroidBroadcast2 жыл бұрын
Стандартная Darcula
@ruborus2 жыл бұрын
Спасибо Кирилл, но для меня непонятно когда говоришь что котлин корутины не работают паралально. ведь таким образом f1 f2 буду работать параллельно val f1 = async (Dispatchers.Default) { loadImage() } val f2 = async (Dispatchers.Default) { loadImage() } doDomethinkgWith(f1.await(), f2.await()) или если запустить два Globalscope.async{ } Globalscope. async{ } пожалуйста объясните
@AndroidBroadcast2 жыл бұрын
Параллельно они работают только на JVM, потому что там есть многопоточность. Корутины в классическом понимании - это про асинхронное выполнение, а не паралелльное
@ruborus2 жыл бұрын
@@AndroidBroadcast понятно спасибо)
@MrPwnzrus2 жыл бұрын
лучший
@berspoland5667 Жыл бұрын
Интересно, что если тестить этот код через Kotlin Playground, то значения в консоли будут исключительно в порядке от 0 до 99 :)
@berspoland5667 Жыл бұрын
Вписал код в IntelliJ IDEA, так же.. В консоли все цифры по порядку.... Почему же у тебя в примере не последовательно?
@berspoland5667 Жыл бұрын
Нашел, оказывается, все дело в выборе кода задержки. При использовании Random с java.util действительно в разнобой, а если использовать delay от корутин, то только в строгом порядке.
@ekaterinaivanova9873 Жыл бұрын
нет гитхаба к лекциям или есть?
@AndroidBroadcast Жыл бұрын
Нет
@mikhailzaytsev42192 жыл бұрын
Спасибо за ролик, может стоит еще сделать текстовую версию?
@AndroidBroadcast2 жыл бұрын
Да, она будет, но не хватает ресурсов на нее. Попробую кому-то делегировать адаптацию сценарию в статью, но пока думаю идея провалится
@ТаримЗиямов2 жыл бұрын
Обьяните плз раницу между ассинхроностью и многопоточностью
@bolnoi82 жыл бұрын
Поток, грубо говоря, представляет собой бесконечный цикл, каждую итерацию которго берется задача из списка задач и выполняется. Многопоточность - это использование более одного потока для выполнения задач. Асинхроность - характеризует порядок выполнения задач. Запуская асинхронную задачу мы не знаем когда она выполнится. Если запускаем несколько, мы не знаем в каком порядке они будут исполнены.
@matjon_dev2 жыл бұрын
Есть график выхода роликов про Coroutines?
@AndroidBroadcast2 жыл бұрын
До конца мая выйдет 5 роликов, потом тоже хочу все закрыть побыстрее. Стараюсь изо всех сил, времени не хватает ((
@oberon2k92 жыл бұрын
Спасибо за курс! Возникает вопрос: будет ли про корутины и ретрофит?
@vasiliychernov21232 жыл бұрын
Достаточно добавить модификатор suspend к методам в интерфейсе и работать с ними как и с другими suspend-функциями, Retrofit поддерживает корутины из коробки c версии 2.6.0.
@AndroidBroadcast2 жыл бұрын
Про него рассказывать не стану, но думаю что в кодинг сессия покажу как работать
@alexvisk89002 жыл бұрын
Спасибо больше за урок . Я пытаюсь понять, кокда гаоврят coroutine не блокирует поток вот например у меня есть suspend fun loadImage() который будет работать IO потоке (например DefaultDispatcher-worker-1) и будет 5 секунд ждать ответа от сервера, это значит что во время ожидания 5 секунд поток в коротром будет работать loadImage (DefaultDispatcher-worker-1 ) не будет заблокирован ? может выполнять другие задачи ? или палюбому DefaultDispatcher-worker-1 будет заблокировано пока ожидает ответа а когда говорится не блокирует поток имеются в виду в моём случе Dispatchers.Main котором он запущен fun main() { scope.launch((Dispatchers.Main)) { loadImage() } } suspend fun loadImage() { // thread DefaultDispatcher-worker-1 withContext(Dispatchers.IO) { api.loadImage() } }
@jojomajo2 жыл бұрын
Хахахахах аж неверится))) он вышел!)
@jojomajo2 жыл бұрын
Ждуны дождались)
@arhitutorials2 жыл бұрын
Что такое корутины? Берем условный FixedThreadPool, сабмитим туда 1000000 Runnable, и вот, мы запустили 1000000 корутин!) Это конечно слишком примитивное объяснение, тут дальше должна быть длинная речь про suspendable континуации и все такое. Но зато позволяет наглядно представить, суть потоков и корутин, и как они между собой соотносятся.
@AndroidBroadcast2 жыл бұрын
Да, Сергей верно все представил
@ПавелЮ-р5э2 жыл бұрын
Top mega nice bro
@ulugbeksattarov13672 жыл бұрын
👍🏻👍🏻
@alekseyyakovlev72872 жыл бұрын
Спасибо за курс! 👍 Немного режет слух произношение слова suspend, в нем нет звука "У". Вот транскрипция [səˈspend].
@timut18302 жыл бұрын
Для любителей фундаментальности хочу порекомендовать лекцию, а лучше целый плейлист от Липовского: kzbin.info/www/bejne/m3O0mmaPZ9WSm7M
@МагестЛоил9 ай бұрын
А.... а по человечески можно объяснить?) а зачем тогда нужны потоки если есть корутины?.
@AndroidBroadcast9 ай бұрын
Без потоков никуда, это на уровне JVM и они лежат пол капотом Kotlin Coroutines
@luckystrike914 ай бұрын
корутины это по факту объекты в очереди, поток берет с очереди корутину и выполняет ее, при этом она может положить себя обратно в конец очередь. воспринимай корутины как ранаблы или таски в ивент лупе, хоть там все немного сложнее, но это самое адекватное описание процесса. а все эти "легковесные потоки" лишь вносят путаницу и вообще супер вредны для понимания процесса.
@EngineerACE Жыл бұрын
Что такое настоящие сопрограммы, парни и не знают. И не должны. Их использовали ещё до их рождения)))
@user-not_defined2 жыл бұрын
На сколько я знаю runblocking нежелательно использовать в андроид, только в тестах для проверки корутин, он блокирует поток на котором вызывается ((
@user-not_defined2 жыл бұрын
@@igorm7480 он сказал что можно на основном но осторожно, хотя да
@kickout3672 жыл бұрын
Еще..
@dmitriymitroshin75252 жыл бұрын
Комментарий.
@s_potam Жыл бұрын
"Логично, что если пользователь закрыл экран... то результат операции нам больше не нужен". Мда, при таком подходе конечно будет и колл-бек хел и трафик на бэке и много еще чего! Задача актуализации модели вообще никак не связана с показом конкретных данных на конкретной страничке! Если мы вообще об ООД говорим. Если задача состоит в банальном запросе от БД, то там прерывать просто нечего, а если запрос данных предполагает возможность создания целого пула задач актуализации, то вспоминаем о слоях и инкапсуляции. В андроидовской идеологии для показа данных должна формироваться view model. Пусть так. Данные для неё запрашиваются у слоя модели, и при таком запросе на уровне модели решается, есть ли актуальная версия запрашиваемых данных или должна пройти например синхронизация с сервером. Эта логика и её реализация в соответсвии с парадигмой инкапсуляции приватна для модели и не может быть объединена в один логический контекст ни с чем внешним. Это следует из элементарных принципов ООД. Ушёл на секунду с экрана, по любому поводу - экран детального вида, ответ на смс или ещё куда - что, прерывать синхронизацию данных и начинать заново? А вопросы обеспечения целостности данных, если тянем не через один запрос? Меня обоснования полезности корутин в оригинальной документации в этой части всегда веселили, за уши притянуто и рекламирует неграмотный подход к проектированию.
@AndroidBroadcast Жыл бұрын
Это возможность привязывать корутину к жизни какого-то объекта. Она спокойной может продолжить операцию и дальше, просто это надо указывать явно
@s_potam Жыл бұрын
@@AndroidBroadcast Это был камешек в общем в огород корутин ;) Любой тезис из обычного набора обоснований преимуществ перед классическим подходом ИМХО далеко не однозначен и в основном цепляется за просчёты в архитектуре либо конкретного приложения, либо глобальной архитектуры Андроид приложения. Всё же мы не о FreeRTOS говорим и красота неблокирующего подхода в отдельно взятой песочнице - очень на любителя. ИМХО естественно.
@DiabloZq2 жыл бұрын
+
@antonpopkov50032 жыл бұрын
Без CoroutineStart.Lazy список тоже по очереди заполнился. Почему так?
@AndroidBroadcast2 жыл бұрын
Не понял вопроса, раскройте больше
@antonpopkov50032 жыл бұрын
@@AndroidBroadcast Так, я невнимательно посмотрел видео и не про то спросил. У нас есть launch и async, но почему-то async не параллелит - список заполнился по-порядку
@AndroidBroadcast2 жыл бұрын
@@antonpopkov5003 Нужно смотреть код. Скидывайте ссылку на Gist
@audiserg2 жыл бұрын
@@antonpopkov5003 потому что await вызывается по порядку. А по идее должен вызываться сразу на всех функциях, для этого там есть специальная функция awaitAll, жаль что Кирилл не акцентировал на этом внимание.
@alekseikuklov86092 жыл бұрын
Потому что порядок выдачи результата определяется циклом list.forEach, а он всегда последовательный. Корутины стартуют одновременно, но результат выводится согласно list.forEach. list.forEach ждёт пока первая корутина выполнится, и печатает её. Потом переходит ко второй. Если вторая корутина к тому времени уже оказывается выполнена, то он печатает её сразу же, без ожидания, и переходит к третей.