это вопрос по котлину, @kotlin_lang.
delay вроде как
блокирующие функции не используются в телах корутин напрямую, тебе нужно строить мост через дефолтную асинхронность, колбеки и "continuation.resume"
https://t.me/android_ru/844894
Зачем так усложнять? Он просто хочет обернуть блок функцию в суспенд. Ему будет достаточно withContext(Dispatchers.IO)
блокирующий метод в корутине залочит тред диспатчера, для io не очен ькритично, их там 64шт вроде, но если это диспатчер на одном треде, то беда, другие корутины не будут выполняться, т.е. ты уже не провернешь фишку с параллельностью через два async подряд. Оно то будет работать, но ломать дизайн АПи корутин - плохая идея. Более того, добавляется необходимость в "скрытых знаниях", разработчик должен знать, что myCoolSuspendFunction() внутри юзает блокирующий метод, а значит снаружи нельзя просто-так менять io диспатчер на другой, а по канонам корутин, ты можешь юзать любые диспатчеры, и вообще не париться
Это всё понятно, но для человека, не знакомого с основами, советовать сложный вариант - плохая идея. Пусть обернёт в IO, а при появлении проблем будет усложнять реализацию. И я крайне сомневаюсь, что Артём будет менять IO диспатчер на другой.
а если он не один в проекте?
А что делать? Всё равно кто-то должен исполнить блокирующий метод, а городить руками отдельный асинхронный механизм только чтобы не блочить корутины - это прям оверкилл.
отдельный воркер/тред. фишка способа выше, в том, что шедулится "новый тред" и диспатчер отпускается (срабатывает условный yeild), а resume / resumeWithException дергается в колбеке запущенного треда
Обсуждают сегодня