写点什么

使用 Kotlin API 实践 WorkManager,看完豁然开朗

用户头像
Android架构
关注
发布于: 刚刚

class BlurWorker(ctx: Context, params: WorkerParameters) : Worker(ctx, params) {


override fun doWork(): Result {


val resourceUri = inputData.getString(KEY_IMAGE_URI)


return try {


if (resourceUri.isNullOrEmpty()) {


Timber.e("Invalid input uri")


throw IllegalArgumentException("Invalid input uri")


}


val outputData = blurAndWriteImageToFile(resourceUri)


Result.success(outputData)


} catch (throwable: Throwable) {


Timber.e(throwable, "Error applying blur")


Result.failure()


}


}


接下来,创建我们的 work 请求,在本例中,我们希望整个操作仅运行一次,所以我们使用 OneTimeWorkRequest.Builder,将需要模糊化处理的图片的 Uri 作为参数传入。


Kotlin 小贴士 : 要创建输入数据,我们可以使用 workDataOf 函数,它会帮我们创建数据构建器,并且填充键值对,然后为我们创建数据。


/* Copyright 2020 Google LLC.


SPDX-License-Identifier: Apache-2.0 */


val blurBuilder = OneTimeWorkRequestBuilder<BlurWorker>()


val data = workDataOf(KEY_IMAGE_URI to imageUri.toString())


blurBuilder.setInputData(data)


我们使用 WorkManager 类将上面所做的工作添加到计划队列并且运行。我们可以提供需要执行的任务和这些任务的限制条件。


/* Copyright 2020 Google LLC.


SPDX-License-Identifier: Apache-2.0 */


val workManager = WorkManager.getInstance(application)


val continuation = workManager.beginUniqueWork(blurBuilder.build())


// 执行任务


continuation.enqueue()


使 Worker 开始执行任务


========================================================================


当您使用 Worker 的时候,WorkManager 会在后台线程中自动调用 Worker.doWork()。doWork() 返回的 Result 会告知 WorkManager 服务是否成功,如果失败则告知是否需要重试。


Worker.doWork() 属于同步调用 – 您的后台操作需要以阻塞的方式执行,并且所有任务需要在整个 doWork() 函数结束的时候完成。如果您在 doWork() 里调用异步的 API 然后返回结果,那么您回调函数的执行可能会出现问题。


#但是如果我希望进行异步操作怎么办?


我们来将上面的示例操作变得复杂一点,比如我希望在数据库中存储所有进行模糊化处理的文件的 Uri。


所以我创建了:


  • 一个简单的 BlurredImage 实体

  • 一个用于插入和获取图片的 DAO 类

  • 数据库


如果您需要执行异步操作,比如在数据库中存储数据或者发起网络请求,在 Kotlin 中,我们推荐使用 CoroutineWorker。


CoroutineWorker 通过使用 Kotlin 协程来执行异步任务。


doWork() 方法是一个 suspend 方法。也就是说我们这里可以调用可挂起的 dao 函数。


/* Copyright 2020 Google LLC.


SPDX-License-Identifier: Apache-2.0 */


class BlurWorker(ctx: Context, params: WorkerParameters) : CoroutineWorker(ctx, params) {


override susp


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


end fun doWork(): Result {


val resourceUri = inputData.getString(KEY_IMAGE_URI)


return try {


if (resourceUri.isNullOrEmpty()) {


Timber.e("Invalid input uri")


throw IllegalArgumentException("Invalid input uri")


}

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
使用 Kotlin API 实践 WorkManager,看完豁然开朗