Başlık olarak, gecikmeden sonra (örneğin 1 saniye) bir işlevi çağırmanın herhangi bir yolu var Kotlin
mı?
Başlık olarak, gecikmeden sonra (örneğin 1 saniye) bir işlevi çağırmanın herhangi bir yolu var Kotlin
mı?
Yanıtlar:
Zamanlamayı kullanabilirsiniz
inline fun Timer.schedule(
delay: Long,
crossinline action: TimerTask.() -> Unit
): TimerTask (source)
örnek (teşekkürler @Nguyen Minh Binh - burada buldum: 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()
}
kotlin.concurrent.schedule
aktarıldıktan sonra bile derlenmeyeceğini düşündüm , çünkü Kotlin sadece bir imza uyuşmazlığından şikayet etti, ancak sonra Long yerine bir Int'yi geçmeye çalıştığımı fark ettim. Bunu düzelttikten sonra derledi.
Kullanmak için bir seçenek de var Handler -> postDelayed
Handler().postDelayed({
//doSomethingHere()
}, 1000)
Handler
Sınıfı kullanmaHandler().postDelayed({
TODO("Do something")
}, 2000)
Timer
Sınıfı kullanmaTimer().schedule(object : TimerTask() {
override fun run() {
TODO("Do something")
}
}, 2000)
Daha kısa
Timer().schedule(timerTask {
TODO("Do something")
}, 2000)
En kısa
Timer().schedule(2000) {
TODO("Do something")
}
Executors
Sınıfı kullanmaExecutors.newSingleThreadScheduledExecutor().schedule({
TODO("Do something")
}, 2, TimeUnit.SECONDS)
launch
Bir koroutin olabilir , delay
ve sonra işlevi çağırabilirsiniz:
/*GlobalScope.*/launch {
delay(1000)
yourFn()
}
GlobalScope
Koroutinin orada çalışmasına izin vermek için bir sınıfın veya nesnenin dışındaysanız, aksi takdirde CoroutineScope
çevredeki sınıfta uygulanması önerilir; bu, gerekirse o kapsamla ilişkili tüm koroutinlerin iptal edilmesine izin verir.
val timer = Timer()
timer.schedule(timerTask { nextScreen() }, 3000)
Timer.schedule()
a TimerTask
ilk argüman olarak bekler . kotlin.concurrent.timerTask()
verilen lambda'yı bir TimerTask
örnekte sarar . Buraya bakın: kotlinlang.org/api/latest/jvm/stdlib/kotlin.concurrent/…
Timer
nesne bir kereden fazla kullanılmayacaksa , verilen örnek bir satıra yoğunlaştırılabilir , örn Timer().schedule(timerTask { ... }, 3000)
. Daha Kotlin dostu bir seçenek de mevcuttur; jonguer'in cevabına bakınız.
3 saniye sonra bir tost göstermek için basit bir örnek :
fun onBtnClick() {
val handler = Handler()
handler.postDelayed({ showToast() }, 3000)
}
fun showToast(){
Toast.makeText(context, "Its toast!", Toast.LENGTH_SHORT).show()
}
Genel kullanım arıyorsanız, işte önerim:
Şu şekilde adlandırılan bir sınıf oluşturun Run
:
class Run {
companion object {
fun after(delay: Long, process: () -> Unit) {
Handler().postDelayed({
process()
}, delay)
}
}
}
Ve şöyle kullanın:
Run.after(1000, {
// print something useful etc.
})
Run.after(1000) { toRun() }
. Am I correct
SingleThread'i kullanmanızı öneriyorum çünkü kullandıktan sonra onu öldürmek zorunda değilsiniz. Ayrıca Kotlin dilinde " stop ()" yöntemi kullanımdan kaldırılmıştır.
private fun mDoThisJob(){
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate({
//TODO: You can write your periodical job here..!
}, 1, 1, TimeUnit.SECONDS)
}
Ayrıca, periyodik iş için kullanabilirsiniz. Bu çok kullanışlı. Her saniye için iş yapmak istiyorsanız, bunun parametrelerini ayarlayabilirsiniz:
Executors.newSingleThreadScheduledExecutor (). ScheduleAtFixedRate (Çalıştırılabilir komut, uzun initialDelay, uzun dönem, TimeUnit birimi);
TimeUnit değerleri: NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS.
@canerkaseler
Timer("SettingUp", false).schedule(500) { doSomething() }