WorkManager调度任务
一、简介
WorkManager是jetpack 中的组件之一,主要用于后台处理任务。适用于后台处理操作的推荐api
WorkManager最低能兼容API Level14,低于API23 WorkManager会使用AlarmManager + Broadcast Receiver 完成任务,高于API23使用JobScheduler来完成任务。两种方案最终都是调用Executor来完成任务。
1.1 WorkManager 重要特点
1.针对不需要及时完成的任务
2.保证任务一定会被执行
WorkManager能保证任务一定会被执行,任务只要提交给了WorkManager,无论应用程序彻底退出还是重新启动,WorkManager依然能够保证完成提交的任务.
1.2 WorkManager的使用
1.导入依赖
dependencies {
def work_version = "2.5.0"
// (Java only)
implementation "androidx.work:work-runtime:$work_version"
// Kotlin + coroutines
implementation "androidx.work:work-runtime-ktx:$work_version"
// optional - RxJava2 support
implementation "androidx.work:work-rxjava2:$work_version"
// optional - GCMNetworkManager support
implementation "androidx.work:work-gcm:$work_version"
// optional - Test helpers
androidTestImplementation "androidx.work:work-testing:$work_version"
// optional - Multiprocess support
implementation "androidx.work:work-multiprocess:$work_version"
}
2.使用Worker定义任务
继承Worker类,重写doWork()方法,需要在任务中执行的代码都在该方法中编写。
class NotifyWorker(context: Context, workParams: WorkerParameters) : Worker(context, workParams){
override fun doWork(): Result {
Log.d("NotifyWorker", "doWork")
return Result.success()
}
}
doWork()有三种类型的返回值
- 执行成功返回Result.success()
- 执行失败返回Result.failure()
- 需要重新执行返回Result.retry()
3.使用WorkRequest配置任务
val notifyWorkerRequest = OneTimeWorkRequestBuilder<NotifyWorker>().setInitialDelay(20, TimeUnit.SECONDS).build()
我们可以创建两种类型的工作请求
OneTimeWorkRequest → 当我们只处理一次
PeriodicWorkRequest → 当我们以一定的时间间隔来做
4.将任务提交给系统
WorkManager.getInstance(this).enqueue(notifyWorkerRequest)
5.观察任务状态
任务提交给系统后可以通过WorkInfo获知任务的状态,WorkInfo包含了任务的id,tag,以及Wokrer对象传递过来的outputdata.有三种方式可以获取到WorkInfo对象。
WorkManager.getWorkInfosByTag()
WorkManager.getWorkInfoById()
WorkManager.getWorkInfosForUniqueWork()
还有三个方法有对应的LiveData方法。
WorkManager.getWorkInfosByTagLiveData()
WorkManager.getWorkInfoByIdLiveData()
WorkManager.getWorkInfosForUniqueWorkLiveData()
WorkManager.getInstance(this).getWorkInfoByIdLiveData(notifyWorkerRequest.id).observe(this, Observer {
Log.d("notifyWorkerRequest", "workInfo=111$it")
})
6.取消任务
WorkManager.getInstance(this).cancelAllWork()
除此之外,还可以通过id或者tag取消某个任务
WorkManager.getInstance(this).cancelWorkById()
WorkManager.getInstance(this).cancelAllWorkByTag()