使用 Android Worker beginUniqueWork ExistingWorkPolicy.KEEP:: 如何检测后续排队何时未开始工作



我目前的Android应用程序采用

archWorkerRuntimeVersion = '2.3.0-beta02'
api "androidx.work:work-runtime:$archWorkerRuntimeVersion"
api "androidx.work:work-runtime-ktx:$archWorkerRuntimeVersion"

我以一次性请求开始工作,如下所示:-

val initialWorkerRequest = OneTimeWorkRequest.Builder(InitialWorker::class.java).addTag(NUMERIC_WORK_IN_PROGRESS_TAG + "${System.nanoTime()}").build()
val taskOneWorkerRequest = OneTimeWorkRequest.Builder(TaskOneWorker::class.java).addTag(NUMERIC_WORK_IN_PROGRESS_TAG + "${System.nanoTime()}").build()
val taskTwoWorkerRequest = OneTimeWorkRequest.Builder(TaskTwoWorker::class.java).addTag(NUMERIC_WORK_IN_PROGRESS_TAG + "${System.nanoTime()}").build()
val taskThreeWorkerRequest = OneTimeWorkRequest.Builder(TaskThreeWorker::class.java).addTag(NUMERIC_WORK_IN_PROGRESS_TAG + "${System.nanoTime()}").build()
val taskFourWorkerRequest = OneTimeWorkRequest.Builder(TaskFourWorker::class.java).addTag(NUMERIC_WORK_IN_PROGRESS_TAG + "${System.nanoTime()}").build()
val finalWorkerRequest = OneTimeWorkRequest.Builder(FinalWorker::class.java).addTag(NUMERIC_WORK_IN_PROGRESS_TAG + "${System.nanoTime()}").build()
WorkManager.getInstance(applicationContext)
.beginUniqueWork(NUMERIC_UNIQUE_WORK_NAME, ExistingWorkPolicy.KEEP, initialWorkerRequest)
.then(listOf(taskOneWorkerRequest, taskTwoWorkerRequest))
.then(taskThreeWorkerRequest)
.then(taskFourWorkerRequest)
.then(finalWorkerRequest)
.enqueue()

我的用户可以尝试多次启动此工作,但是由于我使用beginUniqueWorkExistingWorkPolicy.KEEP因此仅启动工作的一个实例。

我通过 LiveData 观察工人的 ID 如下:

WorkManager.getInstance(applicationContext).getWorkInfoByIdLiveData(initialWorkerRequest.id).apply {
observeForever { workInfo ->
if (workInfo != null && workInfo.state == WorkInfo.State.ENQUEUED) {
...
}
}
}

此方法会在每次用户尝试启动工作时添加一个观察者,即使实际上没有启动任何工作

1). Is this an issue?
2). Is there any way I can detect when using `beginUniqueWork` with `ExistingWorkPolicy.KEEP` does not result in work being started?

如果某些具有相同 uniqueWorkName 的 uniqueWork 已在运行且未成功,则您的方法不会添加观察器。

假设我有一个如下所示的demo((方法,并且UploadWorker 除了等待 10 秒之外什么都不做:

private fun demo() {
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresBatteryNotLow(false)
.setRequiresCharging(false)
.build()
val uploadWorkRequest =
OneTimeWorkRequest.Builder(UploadWorker::class.java)
.setConstraints(constraints)
.build()
WorkManager.getInstance(this)
.enqueueUniqueWork("Hello", ExistingWorkPolicy.KEEP, uploadWorkRequest)
WorkManager.getInstance(this).getWorkInfoByIdLiveData(uploadWorkRequest.id).apply {
observeForever { workInfo ->
Log.i("LOGWORKSTATUS", workInfo.id.toString() + " " + workInfo.state.name)
}
}
}

所以如果我在 10 秒内多次调用上述函数,它只会打印一次 Log 语句。只有当你在 10 秒后调用 demo(( 函数时,它才会打印另一个 Log 语句。

您还可以使用 getWorkInfosForUniqueWorkLiveData(( 来验证从未运行过多个 Work。

最新更新