Есть много вещей, которые могут повлиять на работу WorkManager. Согласно журналам, это не происходит из-за исключений, которые могли быть добавлены в ваших работников. Важно помнить, что один и тот же код может работать по-разному на разных OEM-производителях.
Вот несколько вещей, которые необходимо проверить:
Первый , WorkManager использует другие механизмы внутреннего планирования:
- JobScheduler
- FirebaseJobDispatcher
- AlarmManager
Все они имеют свои собственные ограничения. Например, планировщик заданий имеет 10-минутный лимит для выполнения своей задачи.
Второй - это API самого Work Manager: если запланировано задание с тем же именем и политикой REPLACE
текущий работник останавливается.
Третий - ограничения. Если ограничения больше не выполняются, например, проблема с сетевым подключением, задание будет отменено.
Forth - это маловероятно в любом конкретном случае, но везде есть ошибки: https://issuetracker.google.com/issues/140055777
Пятый . Скорее всего, однако, рабочий остановлен из-за режима Doze или других фоновых оптимизаций работы: https://developer.android.com/training/monitoring-device-state/doze-standby
Чтобы проверить, так ли это, вы можете сделать следующий трюк:
1) Отправьте сообщение Toast в вызове рабочих onStop()
, когда BuildConfig.DEBUG
имеет значение true. Таким образом, вы заметите, когда работник останавливается.
2) Попробуйте получить WakeLock
, который не позволит вашему приложению и телефону перейти в спящий режим (только на время отладки): https://developer.android.com/training/scheduling/wakelock Таким образом, вы можете проверить, если работники умирают в случае, если телефон не засыпает.
Затем, если ваши эксперименты показывают, что рабочий умирает из-за оптимизации батареи, вы можете либо получить пробуждения от чего-то действительно важного, либо просто заставить работай идемпотентно и пиши рабочим так, чтобы можно было остановить и перезапустить работника где-нибудь в будущем. В конце концов, это причина, по которой пришли все ограничения - мы хотим сэкономить батареи пользователей.