Как сделать 10-секундную задержку?

Рейтинг: 2Ответов: 2Опубликовано: 19.01.2015

Здравствуйте.

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

Хочется понимания от более опытных будущих коллег, новичок_

Ответы

▲ 9Принят
try {
    Thread.sleep(1000); //Приостанавливает поток на 1 секунду
} catch (Exception e) {
    
}
▲ 10

Хочу дополнить тему еще одним способов сделать задержку.

Принятый вариант будет вызывать блокировку текущего потока, в нашем случае 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 поток
}