сопрограмма kotlin - как обеспечить выполнение некоторых команд в главном потоке пользовательского интерфейса при вызове внутри сопрограммы? - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть очень простая сопрограмма, которая просто делает некоторую задержку, а затем я хочу, чтобы она отправляла команды в очередь сообщений пользовательского интерфейса.поэтому запустите последние две строки в потоке пользовательского интерфейса.вот сопрограмма:

async{
    delay(5000)
    doSomething()
    doAnotherThing()
}

Я хочу, чтобы последние два метода doSomething () и doAnotherThing () выполнялись в потоке пользовательского интерфейса?Как это может быть сделано ?Из того, что я прочитал, задержка (5000) будет автоматически выполняться асинхронно, но как заставить остальные работать в потоке пользовательского интерфейса?Чтобы было очень ясно, я делаю это с объекта, который был запущен из основного потока.

1 Ответ

0 голосов
/ 23 февраля 2019

async создает сопрограмму и запускается в контексте сопрограммы, унаследованном от CoroutineScope, дополнительные контекстные элементы могут быть указаны с помощью аргумента контекста.Если в контексте нет ни диспетчера, ни какого-либо другого ContinuationInterceptor, то используется Dispatchers.Default.

Если используется Dispatchers.Default, то любая функция, которую вы вызываете в async компоновщике, будет работать асинхронно.Для переключения контекстов вы можете использовать функцию withContext:

async {
    delay(5000)
    withContext(Dispatchers.Main) {
        // if we use `Dispatchers.Main` as a coroutine context next two lines will be executed on UI thread.
        doSomething()
        doAnotherThing()
    }
}

Если async работает в контексте Dispatchers.Main, вам не нужно переключать контексты:

var job: Job = Job()
var scope = CoroutineScope(Dispatchers.Main + job)

scope.async {
    delay(5000) // suspends the coroutine without blocking UI thread

    // runs on UI thread
    doSomething() 
    doAnotherThing()
}

Примечание : async в основном используется для параллельного выполнения.Для запуска используется простой сопрограмма launch строитель.Таким образом, вы можете заменить все функции async в этих примерах на функцию launch.Также для запуска сопрограммы с помощью async Builder необходимо вызвать функцию await() для объекта Deferred, который возвращается функцией async. Вот дополнительная информация .

...