Продолжайте работать уникальную работу вместо того, чтобы начинать новую - PullRequest
0 голосов
/ 11 июля 2019

В случае уникальной работы, которая находится в рабочем состоянии, я хотел бы сохранить ее вместо запуска другой уникальной работы.

Я думал, что ExistingWorkPolicy.KEEP выполнит это для меня, но кажется, что если уже есть уникальная работа, которая находится в рабочем состоянии и не ожидает, она начнет другую работу с этим уникальным тегом.

Из документов ExistingWorkPolicy.KEEP:

Если существует ожидающая (незавершенная) работа с тем же уникальным имя, ничего не делать.

Мы понимаем, что он продолжит работу, только если они находятся в состоянии ожидания, но не в рабочем состоянии.

Я использую последнюю доступную версию AndroidX WorkManager, выпущенную совсем недавно: https://developer.android.com/jetpack/androidx/releases/work#2.1.0-rc01

Edit: Я отправил вопрос в команду Google, вы можете узнать здесь: https://issuetracker.google.com/issues/137210601

Edit2: пример планирования уникальной работы:

    val workRequest = OneTimeWorkRequest.Builder(TestWorker::class.java).build()
    WorkManager.getInstance(this).enqueueUniqueWork("my_worker", ExistingWorkPolicy.KEEP, workRequest)

РЕДАКТИРОВАТЬ 3: После еще нескольких тестов кажется, что я ошибся, заявив, что другой работник запускается, пока работает предыдущий. Ошибка возникла из-за того, что предыдущий работник вошел в состояние ENQUEUED после того, как было RUNNING, потому что он был прерван и затем снова работал с самого начала.

Подводя итог, ExistingWorkPolicy.KEEP работает так, как задумано, и обеспечивает выполнение только одной уникальной работы.

Ответы [ 2 ]

1 голос
/ 11 июля 2019

ExistingWorkPolicy.KEEP означает, что, если уже есть WorkRequest с таким же uniqueWorkName в состоянии НЕ ЗАВЕРШЕНО , WorkManager просто проигнорирует новый запрос и KEEP предыдущий.

Что это значит ЗАВЕРШЕНО ?
Как указано в функции isFinished(), WorkRequest завершается, когда он находится в одномсо следующим состоянием: SUCCEEDED, FAILED и CANCELLED.

В этой презентации есть некоторая диаграмма состояний: Охват WorkManager

Этоодин для OneTimeWorker enter image description here

Это один для PeriodicWorker enter image description here

0 голосов
/ 11 июля 2019

Вы можете проверить, закончилась ли ваша работа, прежде чем планировать новую, если политика KEEP применяется только к ожидающим работам.

WorkManager.getInstance()
  .getStatusById(request.id)
  .observe(this@MainActivity, Observer {
    it?.let {
        val workerResult = it.outputData     
        if (it.state.isFinished) {
           Toast.makeText(this, "Work completed.", Toast.LENGTH_LONG)
           .show()
           //Schedule the job again
        } else {
           Toast.makeText(this, "Work not completed", Toast.LENGTH_LONG)
           .show()
           //Do Nothing
        }
    }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...