Android рабочий менеджер вызывает работника через 10 минут, когда текущий работник все еще работает - PullRequest
0 голосов
/ 28 апреля 2020

У меня периоди c рабочий, который выполняется каждые 15 мин. Рабочий загружает файлы данных на сервер. Но, когда текущий работник занимает время для загрузки и продолжает работать, через 10 минут диспетчер работы вызывает работника через 10 минут, что вызывает проблемы, так как они оба пытаются получить доступ к базе данных и перекрывают друг друга. Есть ли способ остановить рабочий вызов через 10 минут, когда текущий рабочий еще работает.

Я использую версию 2.3.0-alpha03.

Может кто-нибудь помочь, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Если ограничения мешают выполнению рабочего запроса, вы должны иметь возможность использовать равное ограничение для рабочего периода c, установите для равного состояния значение false до запуска oneTimeWorker и значение true после завершения работы.

private boolean RUN_WORKER = true;

Constraints constraints = new Constrains.Builder()
    .equals(RUN_WORKER)
    .build

PeriodicWorkRequest request =
        new PeriodicWorkRequest.Builder(myPeriodicWorker.class, 10, TimeUnit.MINUTES)
                  .setConstraints(constraints)
                  .build();

WorkManager.getInstance(myContext)
    .enqueue(request);

Метод, который запускает OneTimeWorker

RUN_WORKER = false;

OneTimeWorkRequest request = new OneTimeWorkResquest = 
    new OneTimeWorkRequest.Builder(OneTimeWorker.class)
    .build();


WorkManager.getInstance(mContext).getWorkInfoByIdLiveData(request.getId())
        .observe(lifecycleOwner, new Observer<WorkInfo>() {
            @Override
            public void onChanged(@Nullable WorkInfo workInfo) {
              if (workInfo != null && workInfo.state == WorkInfo.State.SUCCEEDED) {
                  displayMessage("Work finished!")
              }

              RUN_WORKER = true;
            }
        });
0 голосов
/ 29 апреля 2020

Я бы попытался поместить рабочих в один и тот же фоновый поток, чтобы рабочий запрос помещался в очередь один за другим.

WorkManager.initialize(
    context,
    new Configuration.Builder()
        .setExecutor(Executors.newFixedThreadPool(1))
        .build());

Подробнее о многопоточности и WorkManager можно узнать здесь

...