Workmanager使用

Workmanager是适合用于持久性工作的推荐解决方案。如果工作始终要通过应用重启和系统重新启动来调度,便是持久性的工作。由于大多数后台处理操作都是通过持久性工作完成的,因此 WorkManager 是适用于后台处理操作的主要推荐 API。

引入库:
    implementation 'androidx.work:work-runtime:2.2.0'
WorkRequest:

WorkRequest要指定执行任务的Worker。


创建周期性任务
        val periodicWorkRequest = PeriodicWorkRequest
            .Builder(DownloadingWorker::class.java,15,TimeUnit.MINUTES)
            .setInitialDelay(10L, TimeUnit.SECONDS)
            .build()
Worker

Worker是一个抽象类,当有一个要执行的任务的时候可以继承Worker类,重写doWork()方法在doWork()方法中实现具体任务的逻辑。

实现类DownloadingWorker:

class DownloadingWorker(context: Context,params:WorkerParameters) : Worker(context,params) {

    override fun doWork(): Result {
        try {

            for (i in 0 ..100) {
                Log.i("MYTAG", "Downloading $i")
            }
            Log.i("MYTAG","Completed")
            return Result.success()
        } catch (e:Exception){
            return Result.failure()
        }
    }
}
将 WorkRequest 提交给系统:
     WorkManager.getInstance(applicationContext).enqueue(periodicWorkRequest)
doWork返回结果类型:
  • Worker.Result.SUCCESS 表示任务执行成功

  • Worker.Result.FAILURE 表示任务执行失败

  • Worker.Result.RETRY 通知WorkManager之后再尝试执行该任务

取消任务:
WorkManager.getInstance().cancelWorkById(compressionWorkId)

WorkManager.getInstance(context).cancelAllWorkByTag(tag)
执行结果日志:
使用WorkManager遇到的问题:
  1. 使用PeriodicWorkRequest执行周期性任务间隔时间小于15分钟不执行,这是该Api指定的最小间距时间。
    2.doWork()方法是在WorkManager管理的后台线程中执行的,更新UI操作只能在主线程中进行。
参考:

https://juejin.cn/post/6844903764424392718
https://developer.android.com/topic/libraries/architecture/workmanager

你可能感兴趣的:(Workmanager使用)