Хочу дополнить тему еще одним способов сделать задержку.
Принятый вариант будет вызывать блокировку текущего потока, в нашем случае UI, чтобы этого избежать, используйте этот вариант, он позволяет выполнять требуемое в другом потоке.
Java
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
/*code*/
}
}, 2000); //specify the number of milliseconds
Kotlin
val handler = android.os.Handler()
handler.postDelayed({ /*code*/ }, 2000) //specify the number of milliseconds
//Или
android.os.Handler().postDelayed({ /*code*/ }, 2000)
Coroutine
CoroutineScope(Dispatchers.IO).launch {
delay(10000L)
}
Можно использовать функцию расширение
object Coroutines {
fun io(work: suspend (() -> Unit)): Job =
CoroutineScope(Dispatchers.IO).launch {
work()
}
fun <T: Any> ioThenMain(work: suspend (() -> T?), callback: ((T?) -> Unit)): Job =
CoroutineScope(Dispatchers.Main).launch {
val data = CoroutineScope(Dispatchers.IO).async rt@{
return@rt work()
}.await()
callback(data)
}
}
Используем так:
Coroutines.ioThenMain({
//выполнение идет в отдельном потоке
}) {
//Результат приходит в ui поток
}