Workmanager не выполняет уникальные задания с политикой APPEND - PullRequest
0 голосов
/ 10 декабря 2018

Я обнаружил странное поведение менеджера работ (альфа-12), что он не выполняет задание после того, как он был помещен в очередь.Код для постановки в очередь ниже:

fun enqueue(phoneNumber: String?,priorityId: String? = null): ListenableFuture<WorkInfo> {
    return WorkManager.getInstance().run {
        val work = OneTimeWorkRequestBuilder<ContentDownloaderWork>()
            .addTag(TIMESTAMP)
            .setInputData(workDataOf(PHONE to phoneNumber, PRIORITY_ID to priorityId))
            .setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 1, TimeUnit.SECONDS)
            .setConstraints(Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build())
            .build()
        beginUniqueWork(TIMESTAMP + priorityId.orEmpty(), ExistingWorkPolicy.APPEND, work).enqueue()
        getWorkInfoById(work.id)
    }
}

Я ставлю эту работу в очередь каждый раз при запуске приложения.И то, что я делаю, убивает мое приложение в середине рабочего процесса, который загружает файлы с сервера.Оно успешно перезапускается каждый раз, когда я снова открываю свое приложение, но в течение ограниченного числа раз.

Кажется, что у него есть какая-то очередь, которая заполняется и не позволяет ставить в очередь больше заданий.Когда я проверяю все доступные вакансии по тегу, это показывает, что некоторые отменены, а некоторые успешны, но когда я пытаюсь поставить в очередь новую работу, она ничего не делает.

Так это ошибка в workmanager или я что-то не так делаю?

1 Ответ

0 голосов
/ 12 декабря 2018

Одной важной информацией, которая отсутствует в вашем описании, является версия Android, которую вы используете в этих тестах.
WorkManager планирует рабочих с помощью API-интерфейса JobScheduler на Android Marshmallow (6.0, API Level 23) и новее, и этопланирует максимальное количество работников, использующих этот API, в любое время ( по умолчанию равно 20 , максимум равно 50 ).Порог, который вы видите, может быть связан с этим значением.

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

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

Последний пункт,Критерии отсрочки в 1 секунду мне кажутся немного агрессивными. Текущее значение по умолчанию с учетом исходного кода составляет 30 секунд, а максимальное - 5 часов .

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

...