Android WorkManager使用入门

AnRFDev 发表于 2021/08/19 00:20:13 2021/08/19
【摘要】 `WorkManager`提供了任务调度功能,我们可以对工作进行标记或命名。 我们用一个示例来演示如何使用WorkManager。本文使用Kotlin。

WorkManager使用入门

WorkManager提供了任务调度功能,我们可以对工作进行标记或命名。
我们用一个示例来演示如何使用WorkManager。本文使用Kotlin。

入门示例

gradle引入依赖

将以下依赖项添加到应用模块的build.gradle文件中

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"
}

添加依赖项并同步 Gradle 后,下一步要定义一些工作。

定义工作

这里的工作为方便测试进行了简化。实际项目中请改为具体的业务代码。
新建UploadWorker类继承Worker类。需要2个参数context: Context, params: WorkerParameters
doWork()方法中是我们的具体任务,在WorkManager提供的后台线程上异步运行。

class UploadWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
    override fun doWork(): Result {
        for (i in 1..3) {
            Log.d(TAG, "模拟执行任务 ${tags.first()} ${Thread.currentThread()}")
            Thread.sleep(100) // 模拟耗时
        }
        return Result.success()
    }
}

doWork()方法中我们打印当前线程信息。后面看看线程运行情况。

任务执行完毕,doWork()需要返回一个Result

  • Result.success():工作成功完成
  • Result.failure():工作失败
  • Result.retry():工作失败,应根据其重试政策在其他时间尝试

创建 WorkRequest

前面我们定义好了工作类UploadWorkerWorkManager可以调度工作,让工作运行起来。工作可以在某个时间段内定期运行,也可以只运行一次。
要运行工作,涉及到WorkRequest类和它的子类。

这里我们演示只运行1次的工作,使用OneTimeWorkRequest
创建workA,作为一个Activity里的变量

private val mWorkA = OneTimeWorkRequest.Builder(UploadWorker::class.java)
        .addTag("workA").build()

创建workB

val workB = OneTimeWorkRequest.Builder(UploadWorker::class.java)
        .addTag("workB").build()

将WorkRequest提交给WorkManager

使用enqueue方法将WorkRequest提交给WorkManager。

获取WorkManager的实例用WorkManager.getInstance(applicationContext)方法。

mWorkA是变量

WorkManager.getInstance(applicationContext).enqueue(mWorkA)
// ...

workB是每次都新建一个对象,然后交给WorkManager去执行。

val workB = OneTimeWorkRequest.Builder(UploadWorker::class.java)
        .addTag("workB").build()
WorkManager.getInstance(applicationContext).enqueue(workB)

执行工作器的确切时间取决于WorkRequest中使用的约束和系统优化方式。
Google官方设计过WorkManager,能够在满足约束的情况下提供最佳行为。

运行测试

按钮A触发mWorkA,按钮B触发workB。分别点击按钮A/B

模拟执行任务 workA Thread[pool-2-thread-3,5,main]
模拟执行任务 workA Thread[pool-2-thread-3,5,main]
模拟执行任务 workA Thread[pool-2-thread-3,5,main]
点击按钮B Thread[main,5,main]
模拟执行任务 workB Thread[pool-2-thread-1,5,main]
模拟执行任务 workB Thread[pool-2-thread-1,5,main]
模拟执行任务 workB Thread[pool-2-thread-1,5,main]

观察log发现,工作的doWork()方法在WorkManager提供的后台线程上异步运行。
主线程是[main,5,main],工作的线程是[pool-2-thread-3,5,main]

而在实际操作中发现,多次点击按钮A,mWorkA只会执行第一次。后面再点击按钮A,mWorkA也不会执行了。

小结

这个例子介绍了如何引入WorkManager,定义工作(任务),排队执行任务。
在使用方式上,让人联想到AsyncTask

其他参考

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。