首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >AAC---WorkManager

AAC---WorkManager

作者头像
None_Ling
发布2018-12-27 14:51:47
9970
发布2018-12-27 14:51:47
举报
文章被收录于专栏:Android相关Android相关Android相关

WorkManager介绍

WorkManager目前还在Alpha阶段,还存在一些问题。不过等后续Release后,又是开发的一大助力。

而它的主要作用则是管理在后台工作的任务,即使APP没有启动,它也能保证任务可以被执行。

WorkManager原理

WorkManager会在System_Server的进程中保存任务,当某些时机到了之后,会通过Binder回调到应用进程中执行该任务。

在5.0以上的版本WorkManager会通过JobScheduler或者Firebase的JobDispatcher来实现,而在5.0以下的版本,则会通过AlarmManager来实现

它有以下好处:

  1. 支持异步的单次、定时的任务
  2. 支持网络条件、存储空间、充电状态等条件的约束
  3. 支持复杂的并行的链式任务
  4. 某个Work Request的输出作为下一个Work Request的输入
  5. 支持14以下的API
  6. 遵循系统的健康
  7. 支持LiveData将请求的状态同步到UI

但是WorkManager仍然无法代替线程池、AsyncTask,例如以下的例子都可以使用WorkManager:上传日志,实现图片的滤镜并且保存图片,定期从网络同步本地数据。

使用WorkManager

  1. 导入WorkManager 在app的Module中导入Kotlin的WorkManager。而目前的版本号已经到了1.0.0-alpha13
dependencies {
    implementation "android.arch.work:work-runtime-ktx:$versions.work"
}
  1. 创建Worker 创建一个类,继承自Worker,并且实现doWork函数,返回任务执行的结果,并且在任务中可以携带数据返回结果。
class TestWorker(ctx: Context, params: WorkerParameters) : Worker(ctx, params) {
    private val TAG by lazy { TestWorker::class.java.simpleName }
    private val KEY_EXCEPTION by lazy { "KEY_EXCEPTION" }
    private val KEY_SUCCESS by lazy { "KEY_SUCCESS" }
    override fun doWork(): Result {
        return try {
            Log.e(TAG, "Worker Do Work")
            val successData = Data.Builder().putString(KEY_SUCCESS, "Success").build()
            Result.success(successData)
        } catch (exception: Exception) {
            val exceptionData = Data.Builder().putString(KEY_EXCEPTION, "Exception :${exception.message}").build()
            Result.failure(exceptionData)
        }
    }
}
  1. 将Worker加入队列中 在创建完任务后,需要将该任务加入WorkManager的队列中。在以下代码中,创建了只执行一次的任务OneTimeWorkRequest,并且携带了输入的参数setInputData,创建完后,就可以将它插入到WorkManager的队列中等待执行。
val inputData = Data.Builder().putString("KEY_INPUT", "input data").build()
val workRequest = OneTimeWorkRequest.Builder(TestWorker::class.java).setInputData(inputData).build()
WorkManager.getInstance().enqueue(workRequest)

通过PeriodicWorkRequest创建的任务,是会定期执行的,需要传入定期的时间即可

创建链式任务

当某些任务具有依赖关系时候(如A依赖B完成的结果,B又依赖C完成的结果),则需要使用链式任务。

链式任务

可以通过WorkManager.beginWith来开始执行任务,并且通过then来将后续的任务链接上。并且可以将前一个任务的输出作为后一个任务的输入。

val workA = OneTimeWorkRequest.Builder(TestWorker::class.java).build()
val workB = OneTimeWorkRequest.Builder(BlurWorker::class.java).build()
val workC = OneTimeWorkRequest.Builder(CleanupWorker::class.java).build()
WorkManager.getInstance().beginWith(workA).then(workB).then(workC).enqueue()

如果只允许单独的任务存在的话,则需要通过beginUniqueWork来开启任务。当存在重复的任务时,会采用传入的ExistingWorkPolicy来对已存在的任务进行策略处理。

WorkManager.getInstance().beginUniqueWork("workName",ExistingWorkPolicy.REPLACE,workA).enqueue()

使用LiveData监听任务状态

在任务执行的过程中,可以通过LiveData来监听任务的状态,所有的任务都具有这几种状态:

  • BLOCKED:阻塞
  • CANCELLED:被取消
  • ENQUEUED:入队列
  • FAILED:失败
  • RUNNING:正在运行
  • SUCCEEDED:运行成功
  1. 通过addTag设置任务的Tag
val workRequest = OneTimeWorkRequest.Builder(TestWorker::class.java).addTag("workRequest").build()
WorkManager.getInstance().enqueue(workRequest)
  1. 1.0.0-alpha10版本中,还可以通过WorkManager.getInstance().getStatusesByTagLiveData()获取对应的Worker的Status。

1.0.0-alpha13版本中,已经没有该函数了,已经替换成getWorkInfosByTagLiveData,而获取的也就是WorkInfo,也差不多。

val liveData = WorkManager.getInstance().getWorkInfosByTagLiveData("workRequest");
liveData.observe(this, Observer {
     if (it[0].state.isFinished) {
      // 任务已经完成
     } else {
      // 任务未完成
     }
})

取消任务

在WorkManager中也可以取消:

// 根据TAG取消所有任务
WorkManager.getInstance().cancelAllWorkByTag()
// 根据UniqueWorkName取消任务
WorkManager.getInstance().cancelUniqueWork()
// 根据uuid取消任务
WorkManager.getInstance().cancelWorkById()

增加任务约束

当某个任务需要在某个条件时开始,可以在任务的Builder中添加约束(Constraint)。

// 创建正在充电的约束
val constraints = Constraints.Builder()
        .setRequiresCharging(true)
        .build()

//  将约束添加到请求中
val save = OneTimeWorkRequestBuilder<BlurWorker>()
        .setConstraints(constraints)
        .addTag(TAG_OUTPUT)
        .build()
continuation = continuation.then(save)

// 启动任务
continuation.enqueue()
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.12.20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • WorkManager介绍
  • WorkManager原理
  • 使用WorkManager
  • 创建链式任务
  • 使用LiveData监听任务状态
  • 取消任务
  • 增加任务约束
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档