WorkManager调度任务

​ 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()

你可能感兴趣的:(android)