Выполнить код через 2 секунды на чистом Котлине

Мне нужно выполнить код после двух секунд ожидания (без блокировки потока пользовательского интерфейса). Проблема в том, что это обычно решается с помощью Timer или Handler, но мое приложение использует Kotlin Multiplatform, поэтому мне нужно, чтобы это был чистый Kotlin, а не какая-либо библиотека Java.

Мне также нужно будет иметь возможность отменить таймер, если я захочу.

Я видел, как этот ответ спрашивал больше или менее то же самое, но они решают это, используя:

runBlocking {
    println("Wait for 5sec")
    delay(5000)
    println("Done waiting for 5sec")
}

Но я действительно не знаю, как его отменить, а также блокирует ли это остальную часть приложения.


person Jaime Alcántara Arnela    schedule 03.06.2020    source источник
comment
Вы почти закончили, вместо runBlocking просто запустите его в каком-нибудь диспетчере, например Dispatchers.Main или Dispatchers.Default. Он ничего не заблокирует.   -  person Animesh Sahu    schedule 03.06.2020
comment
@AnimeshSahu, и это тоже можно отменить?   -  person Jaime Alcántara Arnela    schedule 03.06.2020
comment
Ага! Сама по себе сопрограмма может быть отменена, если она что-то не блокирует; в случае запуска {} она не блокируется.   -  person Animesh Sahu    schedule 03.06.2020


Ответы (1)


Вы можете получить Job ссылку при запуске сопрограммы. Вы можете сделать что-то вроде этого:

    val job = coroutineScope.launch {
        delay(1000)
        doYourStuff()
    }

После этого вы можете использовать job.cancel() или все, что вам нужно. Кроме того, вы можете определить область действия сопрограммы следующим образом.

CoroutineScope(Dispatchers.Main)

Или любой другой диспетчер, который вам подходит. Удачи.

person Samir Spahic    schedule 03.06.2020