WorkManager 基础
上传日志或者报告数据
使用滤镜处理图片的同时保存图片
通过网络定期同步本地数据
// 获取最新的版本号 https://developer.android.google.cn/jetpack/androidx/releases/workdef work_version = "2.5.0"implementation "androidx.work:work-runtime-ktx:$work_version"
首先实现我们自己的 Worker 类。我们会在这里实现真正需要在后台执行业务的代码。您可以扩展 Worker 类,并且复写 doWork() 方法。由于这个类非常重要,我们会在后边内容中进行详细介绍。这里是它最初的实现代码。
/* Copyright 2020 Google LLC.SPDX-License-Identifier: Apache-2.0 */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()}}…}
/* 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)
/* 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 服务是否成功,如果失败则告知是否需要重试。
但是如果我希望进行异步操作怎么办?
https://github.com/googlecodelabs/android-workmanager/pull/213
CoroutineWorker
https://developer.android.google.cn/reference/kotlin/androidx/work/CoroutineWorker
/* Copyright 2020 Google LLC.SPDX-License-Identifier: Apache-2.0 */class BlurWorker(ctx: Context, params: WorkerParameters) : CoroutineWorker(ctx, params) {override suspend 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)// 将 uri 存储到数据库val imageDao = ImagesDatabase.getDatabase(applicationContext).blurredImageDao()imageDao.insert(BlurredImage(resourceUri))Result.success(outputData)} catch (throwable: Throwable) {Timber.e(throwable, "Error applying blur")Result.failure()}}...}
点击屏末 | 阅读原文 | 即刻了解 WorkManager 使用入门
推荐阅读
Go to "Discover" > "Top Stories" > "Wow"