android 协程实现 定时任务

269 阅读3分钟

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中,我们可以使用HandlerpostDelayed()方法来实现定时任务。下面是一个简单的示例代码:

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 构造方法:

  1. Timer timer = new Timer(); //其中会调用this(“Timer-” + serialNumber());, 即它以Timer+序列号为该定时器的名字
  2. Timer timer = new Timer(String name); //以name作为该定时器的名字
  3. Timer timer = new Timer(boolean isDeamon); //是否将此定时器作为守护线程执行
  4. Timer timer = new Timer(name, isDeamon); //定时器名字, 是否为守护线程
创建一个 Timer 对象就是新启动了一个线程,但是这个新启动的线程,并不是守护线程,它一直在后台运行.

运行定时器

  1. 启动一个定时器实质是启动一个线程
  2. 所有的task都是TimerTask的子类
  3. 所有time都是Date类型的日期
  4. 所有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, 时间如果为过去时间, 不会执行过去没有执行的任务, 但是会马上执行