Là tiêu đề, có cách nào để gọi một hàm sau khi trì hoãn (ví dụ 1 giây) Kotlin
không?
Là tiêu đề, có cách nào để gọi một hàm sau khi trì hoãn (ví dụ 1 giây) Kotlin
không?
Câu trả lời:
Bạn có thể sử dụng Lịch trình
inline fun Timer.schedule(
delay: Long,
crossinline action: TimerTask.() -> Unit
): TimerTask (source)
ví dụ (cảm ơn @Nguyen Minh Bình - đã tìm thấy nó ở đây: http://jamie.mccrindle.org/2013/02/exploring-kotlin-st Chuẩn-l Library-part -.html.html )
import java.util.Timer
import kotlin.concurrent.schedule
Timer("SettingUp", false).schedule(500) {
doSomething()
}
kotlin.concurrent.schedule
, bởi vì Kotlin chỉ phàn nàn về sự không phù hợp chữ ký, nhưng sau đó tôi nhận ra rằng tôi đang cố gắng vượt qua một Int thay vì Long. Nó biên dịch sau khi sửa nó.
Ngoài ra còn có một tùy chọn để sử dụng Handler -> postDelayed
Handler().postDelayed({
//doSomethingHere()
}, 1000)
Handler
lớp họcHandler().postDelayed({
TODO("Do something")
}, 2000)
Timer
lớp họcTimer().schedule(object : TimerTask() {
override fun run() {
TODO("Do something")
}
}, 2000)
Ngắn hơn
Timer().schedule(timerTask {
TODO("Do something")
}, 2000)
Ngắn nhất
Timer().schedule(2000) {
TODO("Do something")
}
Executors
lớp họcExecutors.newSingleThreadScheduledExecutor().schedule({
TODO("Do something")
}, 2, TimeUnit.SECONDS)
Bạn có thể launch
một coroutine, delay
sau đó gọi hàm:
/*GlobalScope.*/launch {
delay(1000)
yourFn()
}
Nếu bạn ở bên ngoài một lớp hoặc đối tượng GlobalScope
dự phòng để cho coroutine chạy ở đó, nếu không thì nên thực hiện CoroutineScope
trong lớp xung quanh, cho phép hủy tất cả các coroutine liên quan đến phạm vi đó nếu cần.
val timer = Timer()
timer.schedule(timerTask { nextScreen() }, 3000)
Timer.schedule()
mong đợi TimerTask
như là đối số đầu tiên của nó. kotlin.concurrent.timerTask()
kết thúc lambda đã cho trong một TimerTask
ví dụ. Xem tại đây: kotlinlang.org/api/latest/jvm/stdlib/kotlin.concản/iêu
Timer
đối tượng sẽ không được sử dụng nhiều lần, ví dụ : Timer().schedule(timerTask { ... }, 3000)
. Một tùy chọn thân thiện hơn với Kotlin cũng có sẵn; xem câu trả lời của jonguer.
Một ví dụ đơn giản để hiển thị bánh mì nướng sau 3 giây :
fun onBtnClick() {
val handler = Handler()
handler.postDelayed({ showToast() }, 3000)
}
fun showToast(){
Toast.makeText(context, "Its toast!", Toast.LENGTH_SHORT).show()
}
Nếu bạn đang tìm kiếm cách sử dụng chung, đây là gợi ý của tôi:
Tạo một lớp có tên là Run
:
class Run {
companion object {
fun after(delay: Long, process: () -> Unit) {
Handler().postDelayed({
process()
}, delay)
}
}
}
Và sử dụng như thế này:
Run.after(1000, {
// print something useful etc.
})
Run.after(1000) { toRun() }
. Tôi có đúng không
Tôi khuyên bạn nên sử dụng SingleThread vì bạn không phải giết nó sau khi sử dụng. Ngoài ra, phương thức " stop ()" không được dùng trong ngôn ngữ Kotlin.
private fun mDoThisJob(){
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate({
//TODO: You can write your periodical job here..!
}, 1, 1, TimeUnit.SECONDS)
}
Hơn nữa, bạn có thể sử dụng nó cho công việc định kỳ. Nó rất hữu ích. Nếu bạn muốn thực hiện công việc cho mỗi giây, bạn có thể đặt vì các tham số của nó:
Executors.newSingleThreadSchediatedExecutor (). CalendarAtFixedRate (Lệnh Runnable, dài initDelay, thời gian dài, đơn vị TimeUnit);
Các giá trị TimeUnit là: NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, GIỜ, NGÀY.
@canerkaseler
Timer("SettingUp", false).schedule(500) { doSomething() }