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遇到的问题:
- 使用PeriodicWorkRequest执行周期性任务间隔时间小于15分钟不执行,这是该Api指定的最小间距时间。
2.doWork()方法是在WorkManager管理的后台线程中执行的,更新UI操作只能在主线程中进行。
参考:
https://juejin.cn/post/6844903764424392718
https://developer.android.com/topic/libraries/architecture/workmanager