工作经理的听众立即打来电话



工作完成后,我需要从WorkManager(android.arch.Work:Work runtime ktx:1.0.0-alpha11(进行回调。然而,我添加的侦听器会在安排工作后立即调用。

我是这样做的:

val work = OneTimeWorkRequestBuilder<UploadWorker>()
.setConstraints(constraints)
.setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 1, TimeUnit.MINUTES)
.setInputData(inputData)
.build()
workManager.beginUniqueWork(INSURANCE_UPLOAD_WORKER, ExistingWorkPolicy.REPLACE, work)
.enqueue().result.toWorkResult()

UploadWorker类只有在完成整个上传序列后才返回Success。

这是扩展功能代码:

private val executor = Executor { command -> command?.run() }
class WorkResult(private val future: ListenableFuture<*>) {
fun addListener(listener: () -> Unit) {
future.addListener(Runnable {
debugLog("work result listener runnable called")
listener()
}, executor)
}
}
internal fun ListenableFuture<*>.toWorkResult(): WorkResult {
return WorkResult(this)
}

当我向WorkResult添加监听器时,它们都会立即被调用,而无需等待实际工作完成。对此有什么想法吗?

在找到合适的解决方案之前(没有GCed错误等(,一个基本的方法可以是创建另一个WorkRequest,并将其作为最后一个处理状态的工作请求进行链接。

当然,您必须单独处理错误状态(并且始终为每个WorkRequest返回Result.success(,以允许通过链进行传播。

这绝不是一种可持续的方法,而是一种必要时的快速解决方案

如果您使用这样的liveData而不是使用ListenableFuture 获得结果,则不会观察到问题

WorkManager.getInstance()
.getWorkInfoByIdLiveData(cloudSyncOneTimeWork.id)
.observe(yourLifecycle, yourObserver)

如果你不想把它与生命周期所有者联系在一起,你可以这样称呼它:

WorkManager.getInstance()
.getWorkInfoByIdLiveData(cloudSyncOneTimeWork.id)
.observeForever(yourObserver)

如果您这样做,您有责任在需要时注销侦听器

最新更新