Android WorkManager工作约束,延迟与查询工作

Android WorkManager工作约束,延迟与查询工作,第1张

概述WorkManager工作约束延迟与查询工作 本文可能会混用“工作”与“任务”这两个词。 本文例子使用Kotlin 准备一个工作类(任务)UploadWorker2 class UploadWork WorkManager工作约束,延迟与查询工作

本文可能会混用“工作”与“任务”这两个词。
本文例子使用Kotlin

准备一个工作类(任务)UploaDWorker2

class UploaDWorker2(context: Context,params: WorkerParameters) : Worker(context,params) {    overrIDe fun doWork(): Result {        Log.d(TAG,"模拟执行任务2 ${Thread.currentThread()}")        return Result.success()    }}
工作约束

约束可让工作延迟到满足最佳条件时运行。下面的约束适用于 WorkManager。

名称说明
NetworkType约束运行工作所需的网络类型。例如 Wi-Fi (UNMETERED)。
BatteryNotLow若为 true,那么当设备处于“电量不足模式”时,工作不会运行。
RequiresCharging若为 true,那么工作只能在设备充电时运行。
deviceidle若为 true,则设备必须处于空闲状态才能运行工作。如果考虑到其他应用的性能,建议用这个约束。
StorageNotLow若为 true,那么当设备上的存储空间不足时,工作不会运行。

可用Constraints.Builder()来创建工作约束。然后将Constraints实例分配给WorkRequest.Builder()
也就是说,工作约束是针对工作WorkRequest的。

下面这个工作约束,只有1个要求,在设备使用计费流量是执行任务。

val constraints = Constraints.Builder()        .setrequiredNetworkType(NetworkType.METERED)        .build()val d1 = OneTimeWorkRequest.Builder(UploaDWorker2::class.java)        .setConstraints(constraints)        .addTag("约束").build()mIDList.add(d1.ID) // 登记任务ID,可去掉WorkManager.getInstance(applicationContext).enqueue(d1)

真机测试中,如果一开始手机用着wifi,那么任务不会执行。而关掉wifi,打开流量开关,就会执行任务。
这就是满足最佳条件时运行。

NetworkType说明

androIDx.work.NetworkType是一个枚举类。目前有

枚举说明
NOT_required这个工作不需要网络
CONNECTED这个工作需要有网络连接
UNMETERED需要Wi-Fi
NOT_ROAMING非漫游网络
METERED需要按流量计费的网络
延迟工作

如果工作没有约束,或者当工作加入队列时所有约束都得到了满足,那么系统可能会选择立即运行该工作。
如果不希望工作立即运行,可以给工作设定一个延迟时间。

下面这个工作是要延迟3秒钟。

val d1 = OneTimeWorkRequest.Builder(UploaDWorker2::class.java)        .addTag("延迟1")        .setinitialDelay(3,TimeUnit.SECONDS)        .build()WorkManager.getInstance(applicationContext).enqueue(d1)

enqueue任务后,查一下任务状态。工作从ENQUEUED状态,执行完毕后变成了SUCCEEDED

WorkInfo{mID='2794b4dd-7c02-4fd0-9851-8798a0da3bb2',mState=ENQUEUED,mOutputData=Data {},mTags=[com.rustfisher.tutorial2020.workmanaer.WorkManagerAct$UploaDWorker2,延迟1],mProgress=Data {}}WorkInfo{mID='2794b4dd-7c02-4fd0-9851-8798a0da3bb2',mState=SUCCEEDED,mProgress=Data {}}
查询工作使用UUID查询

新建工作的时候,系统会分配一个UUID。我们可以记录UUID到mIDList里。通过UUID可以查询到工作当前的状态。

val mgr = WorkManager.getInstance(applicationContext)for (ID in mIDList) {    val cur = mgr.getWorkInfoByID(ID)    Log.d(TAG,"查询任务 ${cur.get()}")}

一个工作状态的例子,状态是ENQUEUED

WorkInfo{mID='16cc292d-f140-488f-9ab5-a0d22b95d128',mTags=[com.rustfisher.tutorial2020.workmanaer.WorkManagerAct$UploaDWorker,r1],mProgress=Data {}}
使用tag查询

前面我们给工作打上tag。可以用WorkManager的getWorkInfosByTag()方法把指定tag的工作查出来。

val mgr = WorkManager.getInstance(applicationContext)for (w in mgr.getWorkInfosByTag("约束1").get()) {    Log.d(TAG,"$w")}

工作状态的例子,下面这个工作UploaDWorker状态是SUCCEEDED,tag里有约束1

WorkInfo{mID='fed1974c-77e5-46ba-8b38-f6c01d68fe4c',约束1],mProgress=Data {}}

需要注意的是,工作的状态是存储起来的。即使重启app或者手机,都可以查到这个工作的状态。
假设查询tag是约束1,我们能得到之前创建的含有这个约束1标签的工作。

参考WorkManager入门示例 https://an.rustfisher.com/android/jetpack/workManager/use1/定义工作请求 https://developer.android.com/topic/libraries/architecture/workmanager/how-to/define-work 总结

以上是内存溢出为你收集整理的Android WorkManager工作约束,延迟与查询工作全部内容,希望文章能够帮你解决Android WorkManager工作约束,延迟与查询工作所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1119234.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存