Я думаю, что есть три проблемы.
1) Вы создаете новую периодическую работу каждый раз, когда вы enqueue
myWork
в WorkManager
Экземпляре.
Попробуйтелогика в методе doWork()
вашего MyWorker.class
запускается один раз в первый раз, выполняется дважды во второй раз.Скорее всего, вы добавили 11 работ в Диспетчер работ, и поэтому он запускался 11 раз, когда вы последний раз проверяли.Если вы создаете новые работы и добавляете их в диспетчер работ, то увеличивается число прогонов myWork
.
Подобно планировщику заданий, вы должны проверить, существует ли задание, прежде чем добавлять его вДиспетчер работ.
Пример кода:
final WorkManager workManager = WorkManager.getInstance();
final LiveData<List<WorkStatus>> statusesByTag = workManager
.getStatusesByTag(TAG_PERIODIC_WORK_REQUEST);
statusesByTag.observe(this, workStatuses -> {
if (workStatuses == null || workStatuses.size() == 0) {
Log.d(TAG, "Queuing the Periodic Work");
// Create a periodic request
final PeriodicWorkRequest periodicWorkRequest =
new PeriodicWorkRequest.Builder(SyncWorker.class, 30, TimeUnit.MINUTES)
.addTag(TAG_PERIODIC_WORK_REQUEST)
.build();
// Queue the work
workManager.enqueue(periodicWorkRequest);
} else {
Log.d(TAG, "Work Status Size: " + workStatuses.size());
for (int i = 0; i < workStatuses.size(); i++) {
Log.d(TAG, "Work Status Id: " + workStatuses.get(i).getId());
Log.d(TAG, "Work Status State: " + workStatuses.get(i).getState());
}
Log.d(TAG, "Periodic Work already exists");
}
});
В приведенном выше примере я использую уникальный тег TAG_PERIODIC_WORK_REQUEST
, чтобы идентифицировать свою периодическую работу и проверять, существует ли она или нет перед созданиемit.
2) Ваша работа может не работать, когда приложение убито.
Какой бренд вы тестируете?Это Xiaomi?Вы тестировали его на нескольких других брендах и получили тот же результат?
Был ли он в режиме Doze?И как вы проверяете, что работа не выполняется, если вы установили 24-часовое время?
Диспетчер работ обеспечивает обратную совместимость, но все же вам необходимо обрабатывать логику, специфичную для устройства.На устройствах Xiaomi, аналогично Job Scheduler (или Firebase Job Dispatcher или Alarm), периодическая работа останавливается, когда приложение закрывается.
3) Я просто думаю, что PeriodicWorkRequest
, предоставленный WorkManager
, глючит.
Я тестировал его с начала предыдущей недели на нескольких устройствах.Я создал работу, когда приложение было запущено в первый раз, и не открывал его три дня.Он запускался один раз в первый раз, два раза, когда была запущена вторая синхронизация, и между ними он увеличился в 13 раз, упал до 1 раза, 4 раза и т. Д.,
В другом тесте я создал работус кодом ниже во время первой установки и удалил код из второй установки.Во время этого теста, даже если работа успешно завершена, работа запускается каждый раз, приложение открывается после его уничтожения.
final PeriodicWorkRequest periodicWorkRequest =
new PeriodicWorkRequest.Builder(SyncWorker.class, 30, TimeUnit.MINUTES)
.addTag("periodic-work-request")
.build();
// Queue the work
WorkManager.getInstance().enqueue(periodicWorkRequest);
Я понимаю, что, поскольку оно все еще находится в альфа-версии.Я не думаю, что вы должны использовать его в производстве.