В моем приложении запланированы два периодических работника, один из которых повторяется через 24 часа, а другой через 15 минут.
Первоначально при новой установке все работало, как и ожидалось, но через несколько дней у меня возникла проблема 2устройства (из 5).24-часовой рабочий запускается правильно, а 15-минутный - вообще не срабатывает.Я наблюдаю за этим в течение 24 часов.
Я просмотрел базу данных workmanager через Stetho и увидел несколько записей для 24-часового работника и 0 записей для 15-минутного работника.Я смотрю в таблицу WorkSpec
.
Я отлаживал через Android-студию и после запроса WorkManager с помощью getWorkInfosByTag()
я получил список из 80 объектов для 15-минутного работника, где 79 были в CANCELED
состояние и один находился в состоянии ENQUEUED
.
Итак, очевидно, уволенные работники не добавляются в БД?
Я не нашел ни одного документа от Google, в котором объясняются сценарии, в которых работникотменено.
Я использую 1.0.0-beta03
версию рабочей среды выполнения.Кроме того, я не убиваю приложение и не делаю ничего смешного.Приложение работает в фоновом режиме и не убивается.Устройства Mi A2 (Android 9), Redmi Note 4 (Android 7).
Мне нужно понять, почему увольняют работника и есть ли лучший способ отладить это?Любые указатели будут полезны и проголосовали!
Спасибо.
Edit1: публикация кода для планирования обоих работников.
24-часовой периодический работник:
public static synchronized void scheduleWork() {
checkPreviousWorkerStatus();
if (isWorking()) {
Log.i("AppDataCleanupWorker", "Did not schedule data cleanup work; already running.");
return;
}
if (lastWorkId != null) {
WorkManager.getInstance().cancelAllWorkByTag("AppDataCleanupWorker");
lastWorkId = null;
}
Constraints constraints = new Constraints.Builder()
.setRequiresCharging(true)
.build();
PeriodicWorkRequest.Builder builder = new PeriodicWorkRequest
.Builder(AppDataCleanupWorker.class, 24, TimeUnit.HOURS)
.addTag("AppDataCleanupWorker")
.setConstraints(constraints);
PeriodicWorkRequest workRequest = builder.build();
lastWorkId = workRequest.getId();
WorkManager.getInstance().enqueue(workRequest);
List<WorkInfo> workInfos = WorkManager.getInstance()
.getWorkInfosByTagLiveData("AppDataCleanupWorker")
.getValue();
if (workInfos != null && workInfos.size() > 1) {
throw new RuntimeException("Multiple workers scheduled. Only one schedule is expected.");
}
}
15-минутный периодический работник:
public static synchronized void scheduleWork() {
checkPreviousWorkerStatus();
if (isWorking) {
Log.i("ImageUploadWorker", "Did not schedule image upload work; already running.");
return;
}
if (lastWorkId != null) {
WorkManager.getInstance().cancelAllWorkByTag("ImageUploadWorker");
lastWorkId = null;
}
Constraints constraints = new Constraints.Builder()
.setRequiresBatteryNotLow(true)
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
PeriodicWorkRequest.Builder builder =
new PeriodicWorkRequest.Builder(ImageUploadWorker.class, 15,
TimeUnit.MINUTES)
.addTag("ImageUploadWorker")
.setConstraints(constraints);
PeriodicWorkRequest workRequest = builder.build();
lastWorkId = workRequest.getId();
WorkManager.getInstance().enqueue(workRequest);
List<WorkInfo> workInfos = WorkManager.getInstance()
.getWorkInfosByTagLiveData("ImageUploadWorker").getValue();
if (workInfos != null && workInfos.size() > 1) {
throw new RuntimeException("Multiple workers scheduled. Only one schedule is expected.");
}
}
Примечание. Устройство подключено к Интернету, скорость сети довольно хорошая.