Является ли ожидание блокировки потока пользовательского интерфейса на Android? - PullRequest
0 голосов
/ 13 декабря 2018

Я обернул голову вокруг сопрограмм, и мне было интересно узнать следующий код.У меня есть следующая операция на моем onCreate () .

asyncJob = GlobalScope.launch(Dispatchers.Main) {
    val name = async(Dispatchers.Default) { queryDevices() }.await()
    mDeviceName.text = deviceName
}

Печать этого порядка выполнения, по-видимому, происходит до того, как «имя» будет в потоке пользовательского интерфейса, а после того, как имя задано, оно также будет в потоке пользовательского интерфейса. queryDevicesMethod () находится в фоновом потоке, как и ожидалось.

Но я хотел знать, что на самом деле await () делает при вызове в потоке пользовательского интерфейса?Он блокирует поток пользовательского интерфейса до тех пор, пока не будет возвращено ожидание?

1 Ответ

0 голосов
/ 13 декабря 2018

Сопрограммы не будут блокировать поток при приостановке.Компилятор Kotlin генерирует конечный автомат, который отсоединяет и присоединяет сопрограммы из потока, см. https://github.com/Kotlin/kotlinx.coroutines/blob/master/ui/coroutines-guide-ui.md.

В вашем случае GlobalScope.launch(Dispatchers.Main) запускает новую сопрограмму, ограниченную потоком пользовательского интерфейса.Затем async() запускает новую сопрограмму, ограниченную другим диспетчером.Вызов await() является функцией приостановки и отсоединит первую сопрограмму от потока пользовательского интерфейса, ожидая завершения процедуры async.

Кстати: вы не должны использовать async и await в одном выражении.Это бессмысленно.Что вам действительно нужно, так это запустить функцию queryDevices() от другого диспетчера, но не асинхронно с точки зрения сопрограмм.В этом случае вы должны использовать withContext()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...