web-dev-qa-db-ja.com

Kotlin:AndroidでUIをフリーズせずにコードを遅延させる方法

私が試したKotlinでコードを遅延させようとしています

Thread.sleep(1000)

しかし、UIがフリーズします。

なぜこれが起こっているのか、そしてUIをフリーズせずに遅延させる方法を誰かが知っていますか?

5
asaf

UIをフリーズしたくない場合は、MainThreadからコードを実行する必要があります。
それを行う方法はたくさんあります。いくつかの例:

Thread

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

処方箋

必要です https://github.com/ReactiveX/RxJava

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

コトリンコルーチン

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
}

リファレンス: https://kotlinlang.org/docs/reference/coroutines-overview.html

ドキュメンテーション:

1
Kevin Robatel

Thread.sleep(1000);

現在実行中のスレッドを、指定されたミリ秒数の間スリープ(一時的に実行を停止)します[...]

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

これをUIスレッドで呼び出すと、コードが実行されるデフォルトのスレッドであり、停止して待ってください

純粋なKotlinでは コルーチン を使用する必要があります。

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
}

Androidアプリをプログラミングしている場合、 Handler とAndroidxを使用して、特にNice構文を使用できます。

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