runblocking - kotlin launch
Kotlin-funciĆ³n de espera (5)
¿Hay una función de espera en kotlin? (No me refiero a un cronograma de temporizador, sino a la pausa en la ejecución). He leído que puedes usar Thread.sleep()
. Sin embargo, no funciona para mí, porque la función no se puede encontrar.
Dado que la nueva característica de coroutines estuvo disponible en la versión 1.1 de Kotlin, puede utilizar la función de delay
sin bloqueo con dicha firma:
suspend fun delay(time: Long, unit: TimeUnit = TimeUnit.MILLISECONDS)
En Kotlin 1.2 todavía se encuentra en el paquete kotlinx.coroutines.experimental
. El estado experimental de las coroutinas se describe here .
UPD: Se lanzó Kotlin 1.3, las coroutinas se movieron al paquete kotlinx.coroutines
, ya no son una característica experimental.
Esto lo puedes conseguir fácilmente con Kotlin coroutines.
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 (aplicación)
dependencies {
implementation ''org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.1''
implementation ''org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.1''
}
La suspensión de subprocesos siempre lleva un tiempo cuánto tiempo esperar: https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#sleep(long)
public static void sleep(long millis)
throws InterruptedException
p.ej
Thread.sleep(1_000) // wait for 1 second
Si desea esperar a que otro hilo lo despierte, tal vez `Object # wait () ''sería mejor
https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait()
public final void wait()
throws InterruptedException
Luego, otro hilo debe llamar a yourObject#notifyAll()
por ejemplo, Thread1 y Thread2 comparten un Object o = new Object()
Thread1: o.wait() // sleeps until interrupted
Thread2: o.notifyAll() // wake up ALL waiting Threads of object o
Por favor prueba esto, funcionará para Android:
Handler().postDelayed(
{
// This method will be executed once the timer is over
},
1000 // value in milliseconds
)
Puedes usar cosas del JDK estándar.
Una respuesta previa da Thread.sleep(millis: Long)
. Personalmente prefiero la clase TimeUnit (desde Java 1.5) que proporciona una sintaxis más completa.
TimeUnit.SECONDS.sleep(1L)
TimeUnit.MILLISECONDS.sleep(1000L)
TimeUnit.MICROSECONDS.sleep(1000000L)
Utilizan Thread.sleep
detrás de la escena, y también pueden lanzar InterruptedException.