Cara memanggil fungsi setelah keterlambatan dalam Kotlin?

Seperti judul, apakah ada cara untuk memanggil fungsi setelah penundaan (1 detik misalnya) di Kotlin?

Ada juga pilihan untuk menggunakan Handler -> postDelayed

 Handler().postDelayed({
                    //doSomethingHere()
                }, 1000)
Komentar (5)
Larutan

Anda dapat menggunakan Jadwal

inline fun Timer.schedule(
    delay: Long, 
    crossinline action: TimerTask.() -> Unit
): TimerTask (source)

contoh (terima kasih @Nguyen Minh Binh ditemukan di sini: http://jamie.mccrindle.org/2013/02/exploring-kotlin-standard-library-part-3.html)

import java.util.Timer
import kotlin.concurrent.schedule

Timer("SettingUp", false).schedule(500) { 
   doSomething()
}
Komentar (13)

Banyak Cara

1. Menggunakan Handler kelas

Handler().postDelayed({
    TODO("Do something")
    }, 2000)

2. Menggunakan Timer kelas

Timer().schedule(object : TimerTask() {
    override fun run() {
        TODO("Do something")
    }
}, 2000)

Pendek

Timer().schedule(timerTask {
    TODO("Do something")
}, 2000)

Singkat

Timer().schedule(2000) {
    TODO("Do something")
}

3. Menggunakan Pelaksana kelas

Executors.newSingleThreadScheduledExecutor().schedule({
    TODO("Do something")
}, 2, TimeUnit.SECONDS)
Komentar (1)

Anda harus mengimpor berikut dua perpustakaan:

import java.util.*
import kotlin.concurrent.schedule

dan setelah itu menggunakannya dalam cara ini:

Timer().schedule(10000){
    //do something
}
Komentar (0)

Anda bisa peluncuran a coroutine, penundaan itu dan kemudian memanggil fungsi:

 /*GlobalScope.*/launch {
   delay(1000)
   yourFn()
 }

Jika anda berada di luar kelas atau objek tambahkan GlobalScope untuk membiarkan coroutine berjalan di sana, selain itu dianjurkan untuk melaksanakan CoroutineScope di sekitar kelas, yang memungkinkan untuk membatalkan semua coroutines terkait dengan lingkup jika diperlukan.

Komentar (3)
val timer = Timer()
timer.schedule(timerTask { nextScreen() }, 3000)
Komentar (3)

Contoh sederhana untuk menunjukkan roti setelah *3 detik* :

fun onBtnClick() {
    val handler = Handler()
    handler.postDelayed({ showToast() }, 3000)
}

fun showToast(){
    Toast.makeText(context, "Its toast!", Toast.LENGTH_SHORT).show()
}
Komentar (1)

Jika anda mencari untuk penggunaan generik, di sini adalah saran saya:

Membuat sebuah class bernama Run:

class Run {
    companion object {
        fun after(delay: Long, process: () -> Unit) {
            Handler().postDelayed({
                process()
            }, delay)
        }
    }
}

Dan gunakan seperti ini:

Run.after(1000, {
    // print something useful etc.
})
Komentar (2)