viewModel中使用Job执行定时任务
在ViewModel中使用Job结合 协程 viewModelScope.launch(Dispatchers.IO)来控制任务
var runningRefreshJob = false //用于中止服务
var refreshPieceWorkJob: Job? = null
private fun startRefreshPieceWorkJob() {
refreshPieceWorkJob = viewModelScope.launch(Dispatchers.IO) {
while (runingRefreshJob) {
delay(intervalTime)
withContext(Dispatchers.Main) {
doSomething()
}
}
}
}
fun doSomething(){
LogUtils.d(">>fragment 获取数据定时器")
}
//切换定时更新服务状态
fun toggleRefreshPieceWorkJob(isRunning: Boolean = true) {
try {
if (isRunning && runningRefreshJob) {
return
}
if ((!runningRefreshJob) && isRunning) {
runningRefreshJob = true
startRefreshPieceWorkJob() // 重新开始任务
} else {
runningRefreshJob = false
refreshPieceWorkJob?.cancel() // 取消任务
}
} catch (e: Exception) {
LogUtils.e("${e}")
}
}
Android** Handler 定时任务 Kotlin
在Android开发中,我们经常需要进行一些定时任务的处理,比如定时更新数据、定时发送通知等。而在Android中,我们可以使用Handler来实现定时任务的处理。本篇文章将介绍如何在Kotlin中使用Handler来实现定时任务。
Handler 简介
Handler是Android中一个非常重要的类,用于在主线程与其他线程之间进行通信。通过Handler,我们可以实现在主线程中处理其他线程发送过来的消息。使用Handler可以避免在子线程中直接操作UI,从而避免出现异常。
使用 Handler 定时任务
在Android中,我们可以使用Handler的postDelayed()方法来实现定时任务。下面是一个简单的示例代码:
val handler = Handler(Looper.getMainLooper())
val runnable = object : Runnable {
override fun run() {
// 在这里执行定时任务的操作
Log.d("Handler", "定时任务执行")
handler.postDelayed(this, 1000) // 每隔1秒执行一次
}
}
handler.postDelayed(runnable, 1000) // 延迟1秒后执行第一次
在上面的代码中,我们首先创建了一个Handler对象,并传入了主线程的Looper。然后创建了一个Runnable对象,在run()方法中编写定时任务的操作。最后通过handler.postDelayed()方法来实现定时任务的调度
Java java.util.Timer
Java TimerTask
1.TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。具体的任务在TimerTask中run接口中实现。通过Timer中的schedule方法启动定时任务。是一种定时器工具,用来在一个后台线程计划执行指定任务。
Timer.java中含有3个类:Timer、TimerThread、TaskQueue
TaskQueue类
- TaskQueue中存放一些列将要执行的TimerTask,以数组的形式存放,下标约小(注:下标为0不处理,即使用的最小下标为1),则表明优先级越高####
TimerThread类
- TimerThread继承Thread类,会一直从TaskQueue中获取下标为1的TimerTask进行执行。并根据该TimerTask是否需要重复执行来决定是否放回到TaskQueue中。它可以计划执行一个任务一次或反复多次.
Timer类
- Timer用于配置用户期望的任务执行时间、执行次数、执行内容。它内部会配置,调度TimerThread、TaskQueue。
Timer 构造方法:
- Timer timer = new Timer(); //其中会调用this(“Timer-” + serialNumber());, 即它以Timer+序列号为该定时器的名字
- Timer timer = new Timer(String name); //以name作为该定时器的名字
- Timer timer = new Timer(boolean isDeamon); //是否将此定时器作为守护线程执行
- Timer timer = new Timer(name, isDeamon); //定时器名字, 是否为守护线程
创建一个 Timer 对象就是新启动了一个线程,但是这个新启动的线程,并不是守护线程,它一直在后台运行.
运行定时器
- 启动一个定时器实质是启动一个线程
- 所有的task都是TimerTask的子类
- 所有time都是Date类型的日期
- 所有delay和period都是long类型的延迟时间, 单位为毫秒
API:
schedule
- timer.schedule(task, time);
在time时间执行task任务1次 - timer.schedule(task, delay);
在延迟delay毫秒后执行task任务1次 - timer.schedule(task, firstTime, period);
在firsttime时间执行task1次,之后定期period毫秒时间执行task, 时间如果为过去时间,不会执行过去没有执行的任务, 但是会马上执行 - timer.schedule(task, delay, period);
在延迟delay后执行task1次,之后定期period毫秒时间执行task, 时间如果为过去时间, 不会执行过去没有执行的任务, 但是会马上执行