Євг*_*вич 6 android android-workmanager
我需要在 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()
Run Code Online (Sandbox Code Playgroud)
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)
}
Run Code Online (Sandbox Code Playgroud)
当我将侦听器添加到 WorkResult 时,它们都会立即被调用,而无需等待实际工作完成。对此有什么想法吗?
如果您使用这样的 liveData 而不是使用 ListenableFuture 获得结果,则不会观察到该问题
WorkManager.getInstance()
.getWorkInfoByIdLiveData(cloudSyncOneTimeWork.id)
.observe(yourLifecycle, yourObserver)
Run Code Online (Sandbox Code Playgroud)
如果您不想将其与生命周期所有者绑定,您可以这样调用它:
WorkManager.getInstance()
.getWorkInfoByIdLiveData(cloudSyncOneTimeWork.id)
.observeForever(yourObserver)
Run Code Online (Sandbox Code Playgroud)
如果您这样做,您有责任在需要时取消注册侦听器
| 归档时间: |
|
| 查看次数: |
2187 次 |
| 最近记录: |