• Android WorkManager 定时任务


    App有时可能需要定期运行某些工作。例如,可能要定期备份数据、上传信息到服务器,定期获取新的内容等等。
    在app运行期间,我们使用Handler也可以完成定期的功能。在这里我们介绍WorkManager使用定时任务的方法。

    前面我们介绍了WorkManager的使用方法,约束和延迟等。本文介绍WorkManager的定时任务。如何创建定时任务,查看任务状态,取消任务。

    本文使用kotlin

    注意:可以定义的最短重复间隔是 15 分钟(与 JobScheduler API 相同)。

    gradle

    kotlin使用PeriodicWorkRequestBuilder时候报错误提示

    Cannot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM target 1.6.
    Please specify proper '-jvm-target' option

    根据提示,在app的gradle配置添加kotlinOptionsjvmTarget

    android {
        // 其他配置...
    
        kotlinOptions {
            jvmTarget = "1.8"
        }
    }
    

    创建定时任务

    创建定时任务,用到PeriodicWorkRequestBuilder,传入定时的参数,build()得到任务实例。
    交给WorkManagerenqueue方法即可。

    val r1 = PeriodicWorkRequestBuilder<UploadWorker2>(15, TimeUnit.MINUTES)
            .addTag("r1").build()
    WorkManager.getInstance(applicationContext).enqueue(r1)
    

    上面的代码,enqueue后会立刻执行一次任务。
    多次创建任务,可以得到多个定时任务。

    注意:可以定义的最短重复间隔是 15 分钟(与 JobScheduler API 相同)。

    单一任务

    如果不想要重复的定时任务,需要用WorkManagerenqueueUniquePeriodicWork方法。

    val r1 = PeriodicWorkRequestBuilder<UploadWorker2>(15, TimeUnit.MINUTES)
            .addTag("r2").build()
    WorkManager.getInstance(applicationContext)
            .enqueueUniquePeriodicWork(
                    "单独的定时任务r2",
                    ExistingPeriodicWorkPolicy.KEEP,
                    r1)
    

    PeriodicWorkRequestBuilder创建出任务后。
    调用enqueueUniquePeriodicWork,此方法需要3个参数:

    • uniqueWorkName 唯一的任务名字
    • ExistingPeriodicWorkPolicy 发现任务重复时的处理方法
      • REPLACE 把旧的任务停止并删除,然后插入新的任务
      • KEEP 保留原来的任务,不新增任务
    • PeriodicWorkRequest 任务对象

    enqueueUniquePeriodicWork方法能保证1个名字同时只有一个定时任务(PeriodicWorkRequest)。
    如果是同样的名字(uniqueWorkName),插入任务时可能会替换旧任务(REPLACE),或者不影响旧任务(KEEP)。

    查看任务

    在这里我们用getWorkInfosByTag来查询任务

    val status = WorkManager.getInstance(applicationContext).getWorkInfosByTag("r1")
    val workInfoList: List<WorkInfo> = status.get()
    for (w in workInfoList) {
        Log.d("rustfisher.com", " $w")
    }
    

    查询结果的例子

     WorkInfo{mId='83d7d512-8a5d-4613-acbb-e73ee2855212', mState=ENQUEUED, mOutputData=Data {}, mTags=[com.rustfisher.tutorial2020.workmanaer.WorkManagerAct$UploadWorker2, r1], mProgress=Data {}}
    

    取消任务

    我们有多种取消任务的方法。

    取消所有任务

    cancelAllWork(),取消所有任务

    WorkManager.getInstance(applicationContext).cancelAllWork()
    

    取消单独的任务

    cancelUniqueWork(uniqueWorkName: String),取消单独的任务,传入uniqueWorkName

    WorkManager.getInstance(applicationContext).cancelUniqueWork("单独的定时任务r2")
    

    取消传入tag的所有任务

    cancelAllWorkByTag(tag),取消传入tag的所有任务

    WorkManager.getInstance(applicationContext).cancelAllWorkByTag("r1")
    

    取消特定UUID的任务

    cancelWorkById(UUID),取消特定UUID的任务

    WorkManager.getInstance(applicationContext).cancelWorkById(UUID)
    

    取消任务后,再去查询任务状态,会发现mState=CANCELLED

    WorkInfo{mId='7c9e0deb-5267-4ade-8b95-c695e57f274c', mState=CANCELLED, mOutputData=Data {}, mTags=[r2, com.rustfisher.tutorial2020.workmanaer.WorkManagerAct$UploadWorker2], mProgress=Data {}}
    

    参考

    一个软件工程师的记录
  • 相关阅读:
    http响应状态码大全
    Internet protocol security (ipsec) packet processing for multiple clients sharing a single network address
    linq.js的用法
    linq.js的用法
    程序员每天应该思考的5个问题,你有思考过吗?
    程序员每天应该思考的5个问题,你有思考过吗?
    程序员每天应该思考的5个问题,你有思考过吗?
    Win10 owerShell Get命令大全
    Win10 owerShell Get命令大全
    Win10 owerShell Get命令大全
  • 原文地址:https://www.cnblogs.com/rustfisher/p/15205391.html
Copyright © 2020-2023  润新知