Kotlin - Функция ожидания

Есть ли функция ожидания в kotlin? (я не имею в виду расписание таймера, но фактически приостанавливаю выполнение). Я прочитал, что вы можете использовать Thread.sleep(). Однако это не работает для меня, потому что функция не может быть найдена.

Ответ 1

Снег сна всегда занимает много времени, чтобы ждать: https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#sleep(long)

public static void sleep(long millis)
                  throws InterruptedException

например

Thread.sleep(1_000)  // wait for 1 second

Если вы хотите подождать, пока какой-нибудь другой поток разбудит вас, возможно, "Object # wait()" будет лучше

https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait()

public final void wait()
                throws InterruptedException

Затем другой поток должен вызывать yourObject#notifyAll()

например, Thread1 и Thread2 совместно используют Object o = new Object()

Thread1: o.wait()      // sleeps until interrupted
Thread2: o.notifyAll() // wake up ALL waiting Threads of object o

Ответ 2

Попробуйте это, он будет работать для Android:

Handler().postDelayed(
    {
        // This method will be executed once the timer is over
    },
    1000 // value in milliseconds
)

Ответ 3

Поскольку новая функция сопрограмм стала доступна в Kotlin версии 1.1, вы можете использовать неблокирующую функцию delay с такой подписью:

suspend fun delay(time: Long, unit: TimeUnit = TimeUnit.MILLISECONDS)

В Kotlin 1.2 он все еще находится в пакете kotlinx.coroutines.experimental. Экспериментальный статус сопрограмм описан здесь.

UPD: Kotlin 1.3 был выпущен, сопрограммы были перемещены в пакет kotlinx.coroutines, они больше не являются экспериментальной функцией.

UPD 2: Чтобы использовать этот метод внутри неподдерживаемых методов, можно сделать его блокирующим, как и любые другие приостановленные методы, окружив его runBlocking {}:

runBlocking {
    delay(2, TimeUnit.SECONDS)
}

Ответ 4

Вы можете использовать материал стандартного JDK.

Предыдущий ответ дает Thread.sleep(millis: Long). Лично я предпочитаю класс TimeUnit (начиная с Java 1.5), который обеспечивает более полный синтаксис.

TimeUnit.SECONDS.sleep(1L)
TimeUnit.MILLISECONDS.sleep(1000L)
TimeUnit.MICROSECONDS.sleep(1000000L)

Они используют Thread.sleep за сценой, и они могут также Thread.sleep InterruptedException.

Ответ 5

Вы можете легко добиться этого с сопрограммами Kotlin

class SplashActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)

        CoroutineScope(Dispatchers.IO).launch {
            delay(TimeUnit.SECONDS.toMillis(3))
            withContext(Dispatchers.Main) {
                Log.i("TAG", "this will be called after 3 seconds")
                finish()
            }
        }
        Log.i("TAG", "this will be called immediately")
    }
}

build.gradle (приложение)

dependencies {
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.1'
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.1'
}