При использовании Android Worker beginUniqueWork ExistingWorkPolicy.KEEP :: Как определить, когда последующие очереди не начинают работать - PullRequest
1 голос
/ 17 января 2020

Моя текущая Android Приложение использует

archWorkerRuntimeVersion = '2.3.0-beta02'

api "androidx.work:work-runtime:$archWorkerRuntimeVersion"
api "androidx.work:work-runtime-ktx:$archWorkerRuntimeVersion"

Я начинаю работу как OneTimeRequests следующим образом: -

        val initialWorkerRequest = OneTimeWorkRequest.Builder(InitialWorker::class.java).addTag(NUMERIC_WORK_IN_PROGRESS_TAG + "${System.nanoTime()}").build()
        val taskOneWorkerRequest = OneTimeWorkRequest.Builder(TaskOneWorker::class.java).addTag(NUMERIC_WORK_IN_PROGRESS_TAG + "${System.nanoTime()}").build()
        val taskTwoWorkerRequest = OneTimeWorkRequest.Builder(TaskTwoWorker::class.java).addTag(NUMERIC_WORK_IN_PROGRESS_TAG + "${System.nanoTime()}").build()
        val taskThreeWorkerRequest = OneTimeWorkRequest.Builder(TaskThreeWorker::class.java).addTag(NUMERIC_WORK_IN_PROGRESS_TAG + "${System.nanoTime()}").build()
        val taskFourWorkerRequest = OneTimeWorkRequest.Builder(TaskFourWorker::class.java).addTag(NUMERIC_WORK_IN_PROGRESS_TAG + "${System.nanoTime()}").build()
        val finalWorkerRequest = OneTimeWorkRequest.Builder(FinalWorker::class.java).addTag(NUMERIC_WORK_IN_PROGRESS_TAG + "${System.nanoTime()}").build()

        WorkManager.getInstance(applicationContext)
            .beginUniqueWork(NUMERIC_UNIQUE_WORK_NAME, ExistingWorkPolicy.KEEP, initialWorkerRequest)
            .then(listOf(taskOneWorkerRequest, taskTwoWorkerRequest))
            .then(taskThreeWorkerRequest)
            .then(taskFourWorkerRequest)
            .then(finalWorkerRequest)
            .enqueue()

Мои пользователи могут пытаться запустить эту работу несколько раз, однако как Я использую beginUniqueWork с ExistingWorkPolicy.KEEP, только один экземпляр работы запущен.

Я наблюдаю за работником через LiveData для ID следующим образом:

  WorkManager.getInstance(applicationContext).getWorkInfoByIdLiveData(initialWorkerRequest.id).apply {
                observeForever { workInfo ->
                    if (workInfo != null && workInfo.state == WorkInfo.State.ENQUEUED) {
                        ...
                    }
                }
    }

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

1). Is this an issue?
2). Is there any way I can detect when using `beginUniqueWork` with `ExistingWorkPolicy.KEEP` does not result in work being started?

1 Ответ

0 голосов
/ 29 января 2020

Ваш подход не добавит наблюдателя, если какой-то uniqueWork с таким же uniqueWorkName уже запущен и не УСПЕШЕН.

Предположим, у меня есть метод demo (), как показано ниже, и UploadWorker ничего не делает, кроме как ждать 10 секунд:

  private fun demo() {
    val constraints = Constraints.Builder()
        .setRequiredNetworkType(NetworkType.CONNECTED)
        .setRequiresBatteryNotLow(false)
        .setRequiresCharging(false)
        .build()

    val uploadWorkRequest =
        OneTimeWorkRequest.Builder(UploadWorker::class.java)
            .setConstraints(constraints)
            .build()

    WorkManager.getInstance(this)
        .enqueueUniqueWork("Hello", ExistingWorkPolicy.KEEP, uploadWorkRequest)

    WorkManager.getInstance(this).getWorkInfoByIdLiveData(uploadWorkRequest.id).apply {
        observeForever { workInfo ->
            Log.i("LOGWORKSTATUS", workInfo.id.toString() + " " + workInfo.state.name)

        }
    }
}

Таким образом, если я вызову вышеупомянутую функцию несколько раз в течение 10 секунд, она напечатает инструкцию Log только один раз. Только если вы вызовете функцию demo () через 10 секунд, она напечатает другую инструкцию Log.

Вы также можете использовать getWorkInfosForUniqueWorkLiveData (), чтобы убедиться, что никогда не выполняется более одной Работы.

...