ในฐานะที่เป็นชื่อมีวิธีใดที่จะเรียกใช้ฟังก์ชั่นหลังจากล่าช้า (ตัวอย่างเช่น 1 วินาที) ในKotlin
?
ในฐานะที่เป็นชื่อมีวิธีใดที่จะเรียกใช้ฟังก์ชั่นหลังจากล่าช้า (ตัวอย่างเช่น 1 วินาที) ในKotlin
?
คำตอบ:
คุณสามารถใช้กำหนดการ
inline fun Timer.schedule(
delay: Long,
crossinline action: TimerTask.() -> Unit
): TimerTask (source)
ตัวอย่าง (ขอบคุณ @Nguyen Minh Binh - พบได้ที่นี่: 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
เพราะ Kotlin เพียงแค่บ่นว่ามีลายเซ็นที่ไม่ตรงกัน แต่จากนั้นฉันก็รู้ว่าฉันกำลังพยายามผ่าน Int แทน Long มันรวบรวมหลังจากแก้ไขแล้ว
นอกจากนี้ยังมีตัวเลือกให้ใช้ Handler -> postDelayed
Handler().postDelayed({
//doSomethingHere()
}, 1000)
Handler
คลาสHandler().postDelayed({
TODO("Do something")
}, 2000)
Timer
คลาสTimer().schedule(object : TimerTask() {
override fun run() {
TODO("Do something")
}
}, 2000)
สั้น
Timer().schedule(timerTask {
TODO("Do something")
}, 2000)
ที่สั้นที่สุด
Timer().schedule(2000) {
TODO("Do something")
}
Executors
คลาสExecutors.newSingleThreadScheduledExecutor().schedule({
TODO("Do something")
}, 2, TimeUnit.SECONDS)
คุณต้องนำเข้าสองไลบรารีต่อไปนี้:
import java.util.*
import kotlin.concurrent.schedule
และหลังจากนั้นใช้ในวิธีนี้:
Timer().schedule(10000){
//do something
}
คุณสามารถlaunch
coroutine delay
ได้แล้วเรียกใช้ฟังก์ชัน:
/*GlobalScope.*/launch {
delay(1000)
yourFn()
}
หากคุณอยู่นอกคลาสหรือวัตถุเสริมGlobalScope
เพื่อให้ coroutine ทำงานที่นั่นมิฉะนั้นจะแนะนำให้ใช้CoroutineScope
ในคลาสโดยรอบซึ่งช่วยให้สามารถยกเลิก coroutines ทั้งหมดที่เกี่ยวข้องกับขอบเขตนั้นหากจำเป็น
val timer = Timer()
timer.schedule(timerTask { nextScreen() }, 3000)
Timer.schedule()
คาดว่าจะTimerTask
เป็นอาร์กิวเมนต์แรก kotlin.concurrent.timerTask()
ตัดแลมบ์ดาที่ระบุไว้ในTimerTask
อินสแตนซ์ ดูที่นี่: kotlinlang.org/api/latest/jvm/stdlib/kotlin.concurrent/ …
Timer
วัตถุนั้นจะไม่ถูกใช้มากกว่าหนึ่งครั้งเช่นTimer().schedule(timerTask { ... }, 3000)
. ตัวเลือกที่เป็นมิตรกับ Kotlin ก็มีให้เช่นกัน ดูคำตอบของ jonguer
ตัวอย่างง่ายๆเพื่อแสดงขนมปังหลังจาก3 วินาที :
fun onBtnClick() {
val handler = Handler()
handler.postDelayed({ showToast() }, 3000)
}
fun showToast(){
Toast.makeText(context, "Its toast!", Toast.LENGTH_SHORT).show()
}
หากคุณกำลังมองหาการใช้งานทั่วไปนี่คือคำแนะนำของฉัน:
สร้างคลาสที่ชื่อว่าRun
:
class Run {
companion object {
fun after(delay: Long, process: () -> Unit) {
Handler().postDelayed({
process()
}, delay)
}
}
}
และใช้ดังนี้:
Run.after(1000, {
// print something useful etc.
})
Run.after(1000) { toRun() }
Lamda ฉันถูกต้อง
ฉันแนะนำให้ใช้SingleThreadเพราะคุณไม่จำเป็นต้องฆ่ามันหลังจากใช้งาน นอกจากนี้เมธอด" stop ()" ยังเลิกใช้ในภาษา Kotlin
private fun mDoThisJob(){
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate({
//TODO: You can write your periodical job here..!
}, 1, 1, TimeUnit.SECONDS)
}
ยิ่งกว่านั้นคุณสามารถใช้มันสำหรับงานตามกำหนดเวลา มันมีประโยชน์มาก หากคุณต้องการทำงานในแต่ละวินาทีคุณสามารถตั้งค่าได้เนื่องจากพารามิเตอร์ของมัน:
Executors.newSingleThreadScheduledExecutor (). scheduleAtFixedRate (คำสั่ง Runnable, initialDelay ที่ยาว, ระยะเวลานาน, หน่วย TimeUnit);
ค่า TimeUnit คือ: NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, ชั่วโมง, DAYS
@canerkaseler
Timer("SettingUp", false).schedule(500) { doSomething() }