Başlık olarak, gecikmeden sonra (örneğin 1 saniye) bir işlevi çağırmanın herhangi bir yolu var Kotlinmı?
Başlık olarak, gecikmeden sonra (örneğin 1 saniye) bir işlevi çağırmanın herhangi bir yolu var Kotlinmı?
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.scheduleaktarı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)
HandlerSınıfı kullanmaHandler().postDelayed({
TODO("Do something")
}, 2000)
TimerSı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")
}
ExecutorsSınıfı kullanmaExecutors.newSingleThreadScheduledExecutor().schedule({
TODO("Do something")
}, 2, TimeUnit.SECONDS)
launchBir koroutin olabilir , delayve sonra işlevi çağırabilirsiniz:
/*GlobalScope.*/launch {
delay(1000)
yourFn()
}
GlobalScopeKoroutinin 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 TimerTaskilk 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/…
Timernesne 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() }