workmanager侦听器立即调用

时间:2018-11-13 12:36:17

标签: 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()

UploadWorker类仅在完成整个上传序列后才返回成功。

这是扩展功能代码:

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时,将立即调用所有侦听器,而无需等待实际工作完成。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

如果使用liveData这样的结果而不是使用ListenableFuture来获得结果,则不会出现问题

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

如果您不想将其绑定到生命周期所有者,则可以这样称呼它:

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

如果您这样做,则有责任在需要时取消注册侦听器

答案 1 :(得分:0)

在为此找到适当的解决方案之前(无GC错误等),最基本的方法是创建另一个WorkRequest并将其链接为处理状态的最后一个工作请求。

当然,您将必须分别处理错误状态(并始终为每个WorkRequest返回Result.success)以允许通过链传播。

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