Слушатель Workmanager позвонил немедленно - PullRequest
0 голосов
/ 13 ноября 2018

Мне нужен обратный вызов после завершения работы из 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, все они вызываются немедленно, не дожидаясь завершения фактической работы. Есть мысли по этому поводу?

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

До тех пор, пока для этого не будет найдено правильное решение (без ошибок GCed и т. Д.), Элементарный подход может заключаться в создании другого WorkRequest и его цепочке как последнем рабочем запросе для обработки состояния.

Конечно, вам придется обрабатывать состояния ошибок отдельно (и всегда возвращать Result.success для каждого WorkRequest), чтобы разрешить распространение по цепочке.

Это ни в коем случае не устойчивый подход, а скорее быстрое исправление в случае необходимости

0 голосов
/ 08 февраля 2019

Проблема не наблюдается, если вы получаете результат с liveData, подобным этому, вместо использования ListenableFuture

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

Если вы не хотите связывать его с владельцем жизненного цикла, вы можете вызвать его так:

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

Если вы сделаете это, вы обязаны отменить регистрацию слушателя, когда захотите

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...