Есть ли функция ожидания в kotlin? (я не имею в виду расписание таймера, но фактически приостанавливаю выполнение). Я прочитал, что вы можете использовать Thread.sleep()
. Однако это не работает для меня, потому что функция не может быть найдена.
Kotlin - Функция ожидания
Ответ 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'
}