Почему WorkManager запускается несколько раз, как только мое приложение запускается?

У меня есть приложение, в котором я объявил WorkManager, и переопределенная функция doWork() вызывается 3 или 4 раза, как только мое приложение запускается, не запрашивая, чтобы система запускала его в любое время в коде...

Я проверил, чтобы в приложении не было ссылки на WorkManager. В файле App.kt есть только один (который расширяет Application()).

В App.kt:

class App : Application(){

companion object {
    var appSyncRepository = AppSyncRepository()
}
}

В AppSyncRepository.kt:

class AppSyncRepository {
}

class AppSyncRepositoryWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
override fun doWork(): Result {
    return Result.success()
}
}

Я ожидаю, что рабочий процесс не будет вызван, потому что я пока не объявлял ни OneTimeWorkRequestBuilder, ни PeriodicWorkRequestBuilder.

Были ли у вас когда-нибудь PeriodicWorkRequest в вашем приложении? Даже если вы удалите PeriodicWorkRequest и переустановите свое приложение, PeriodicWorkRequest, которое вы уже поставили в очередь, не будет уничтожено, если вы не отмените его. Вся ваша периодическая работа будет вызываться при запуске процесса приложения. Кроме того, кажется, что несколько запросов одного и того же задания поставлены в очередь. Используйте enqueueUniquePeriodicWork, чтобы избежать дублирования работ.

Sanlok Lee 29.06.2019 03:13

Нет, я не добавлял никакого кода ни с PeriodicWorkRequestBuilder, ни с OneTimeWorkRequestBuilder.

KotlinIsland 01.07.2019 10:55

Я думаю, что Санлок Ли верен после анализа этого вопроса (несколько месяцев назад), и, если я хорошо помню, то, что вы написали, является объяснением.

KotlinIsland 09.05.2020 19:01
1
3
1 248
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Извините, у меня недостаточно репутации, чтобы комментировать.

В своем тестировании вы установили запрос PeriodicWorkRequestBuilder? Если это так, вы должны отменить его.

В качестве первого шага я бы проверил, что запланировано.

void cancelJob(){
    WorkManager.getInstance(mContext).cancelAllWorkByTag(SYNC_WORK_JOB1);
    WorkManager.getInstance(mContext).cancelAllWork();
    Log.d(TAG, "Job cancelled!");
}

private boolean isWorkScheduled() {
WorkManager instance = WorkManager.getInstance(mContext);
    ListenableFuture<List<WorkInfo>> statuses = instance.getWorkInfosByTag(SYNC_WORK_JOB1);
    try {
        boolean running = false;
        List<WorkInfo> workInfoList = statuses.get();
        for (WorkInfo workInfo : workInfoList) {
            WorkInfo.State state = workInfo.getState();
            running = state == WorkInfo.State.RUNNING | state == WorkInfo.State.ENQUEUED;
        }
        return running;
    } catch (ExecutionException e) {
        e.printStackTrace();
        return false;
    } catch (InterruptedException e) {
        e.printStackTrace();
        return false;
    }
}

Или вы можете запустить в окне терминала

adb shell dumpsys jobscheduler | grep -C 5 SyncWorkManagerService
adb shell dumpsys jobscheduler | grep -B 10 "Pending queue"

Что такое SyncWorkManagerService?

IgorGanapolsky 03.05.2020 19:43

Другие вопросы по теме