web-dev-qa-db-fra.com

Kotlin: Comment retarder le code dans Android sans faire geler l'interface utilisateur

J'essaie de retarder le code dans Kotlin J'ai essayé

Thread.sleep(1000)

Mais cela gèle l'interface utilisateur.

Est-ce que quelqu'un sait pourquoi cela se produit et comment retarder sans geler l'interface utilisateur?

5
asaf

Si vous ne voulez pas geler l'interface utilisateur, vous devez exécuter votre code hors du MainThread .
Il existe de nombreuses façons de procéder. Quelques exemples:

Thread

Thread {
    Thread.sleep(1000)
    // Your code
}.start()

Rx

Vous avez besoin de https://github.com/ReactiveX/RxJava

Flowable.timer(1000, TimeUnit.MILLISECONDS)
    .subscribeOn(AndroidSchedulers.mainThread())
    .subscribe { 
        // Your code
    }

Kotlin coroutine

GlobalScope.launch { // launch new coroutine in background and continue
    delay(1000L) // non-blocking delay for 1 second (default time unit is ms)
    println("World!") // print after delay
}

référence: https://kotlinlang.org/docs/reference/coroutines-overview.html

Documentations:

1
Kevin Robatel

Thread.sleep(1000);

Fait dormir le thread en cours d'exécution (arrête temporairement l'exécution) pendant le nombre de millisecondes spécifié, [...]

voir https: //docs.Oracle.com/javase/7/docs/api/Java/lang/Thread.html#sleep (long)

Si vous appelez cela sur le thread d'interface utilisateur , qui est le thread par défaut sur lequel votre code s'exécute, , il s'arrêtera et attendez.

En Kotlin pur, vous devez utiliser un coroutine :

import kotlinx.coroutines.*

fun main() {
    GlobalScope.launch { // launch new coroutine in background and continue
        delay(1000L) // non-blocking delay for 1 second (default time unit is ms)
        println("World!") // print after delay
    }
    println("Hello,") // main thread continues while coroutine is delayed
    Thread.sleep(2000L) // block main thread for 2 seconds to keep JVM alive
}

Si vous programmez une Android vous pouvez utiliser un Handler et Androidx pour une syntaxe particulièrement agréable:

Handler().postDelayed( 1000 ) { doSomething() }
0
leonardkraemer