在kotlin中,执行定时任务借助于java.util下的TimerTask,Date和Timer三个类实现,最终执行语句格式为
Timer().schedule(task, time, period)
看起来很简单,timer.schedule()是一个函数,task是一个TimerTask类,表示要执行的任务,time是是一个Date类,表示第一次执行的时间,period是一个长整数,表示周期(单位为毫秒)。(kotlin里面时间单位基本上用的是毫秒,而在python里面我更多的用的是秒,刚开始确实有点不习惯,好了不说废话了)。
首先先看看TimerTask类如何构造。在kotlin里面这是个抽象类,无法直接实例化。所以接下来要构造一个继承该类的子类,重写run方法就够了,再实例化一个就够了
class MyTimerTask() : TimerTask() {
override fun run() {
//这里填上每次触发要执行的代码
}
}
val task = MyTimeTask()
有的时候你需要传入一些参数作为属性以供重用,比如
class MyTimerTask(val str:String) : TimerTask() {
override fun run() {
println(str)
}
}
val task = MyTimerTask("Hello World!")
这样就能每次调用时打印传入的字符串参数str
接下来看看Date类如何构造,这个也很简单
val date = date(2020,1,1,0,0,0)
六个参数分别为年月日时分秒,如果只填3,4或5个参数,调用的函数仍然按这个顺序赋值,只不过缺的那些默认为零。如果一个参数也不填的话,就是获取当前时间
当然还有字符串解析解析等方式构造出来Date,用起来也更加方便,不过等以后再讲。
合并以上内容,形成以下示例
import java.util.*
class MyTimerTask(val str:String) : TimerTask() {
override fun run() {
println(str)
}
}
fun main(){
val task = MyTimerTask("Hello World!")
Timer().schedule(task, Date(), 1000)
}
这样控制台就会一秒输出一行Hello World!。
当然如果只是单次使用也可以用匿名内部类
import java.util.*
fun main(){
Timer().schedule(object:TimerTask(){
override fun run() {
println("Hello World!")
}
}, Date(), 1000)
}
不过可以发现仅仅靠这些在某些场合还是不够人性化,比如闹钟,人们肯定是想自己设好时分秒就行了,还要自己写入年月日,这就太不人性了,这些问题留着下次解决。
另外提一点,如果开始时间设的早于程序开始时间,程序启动时,它会把原来遗漏的补上,而后面的依然按照设定值为参考。
本人编程尚属新手,如有错误,欢迎指正。(不过这么短的程序这么简单的功能,,我为什么说这么一大段)