Android Worker выполняет задание несколько раз - PullRequest
0 голосов
/ 16 сентября 2018

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

WorkManager workManager = WorkManager.getInstance();
PeriodicWorkRequest ulpBackup;

ulpBackup = new PeriodicWorkRequest
    .Builder(Ulp.class, 15, TimeUnit.MINUTES)
    .addTag(activity.getString(R.string.job_tag))
    .build();
workManager.enqueue(ulpBackup);

А вот UlpBackup.class

public class UlpBackup extends Worker {
    private Integer responseCounter = 0;

    public UlpBackup() {}

    @NonNull
    @Override
    public Result doWork() {

        Log.d(logTag, "Starting periodic backup job";   
        final CountDownLatch countDownLatch = new CountDownLatch(1);

        /** Read from local database and upload to firestore **/

        localdb.setAPIListener(new APIListener() {
            @Override
            public void OnSuccess() {
                responseCounter++;
                if (responseCounter == 5) {
                    countDownLatch.countDown();
                }
            }

            @Override
            public void OnFailure() {
                responseCounter++;
                if (responseCounter == 5) {
                    countDownLatch.countDown();
                }
            }
        });

        localdb.sync();

        try {
            countDownLatch.await(300, TimeUnit.SECONDS);
        } catch (Exception exception) {
            Log.e(logTag, "Error in user list backup job " + exception.getMessage());
            return Result.FAILURE;
        }

        Log.e(logTag, "Ulp backup completed");
        return Result.SUCCESS;
}

Приведенный выше код работает нормально, и работа выполнялась примерно каждые 15 минут, как и ожидалось.Единственное, чего я не понимаю, это то, что каждый раз, когда задание выполняется несколько раз, кто-то может объяснить, почему и как мне этого избежать?

Из журнала:

09-15 23:33:37.514 8190-8410: Starting periodic backup job
09-15 23:33:37.520 8190-8414: Starting periodic backup job
09-15 23:33:37.561 8190-8412: Starting periodic backup job
09-15 23:33:37.568 8190-8413: Starting periodic backup job
...
...
09-15 23:33:38.183 8190-8414: Ulp backup completed
09-15 23:33:39.164 8190-8412: Ulp backup completed
09-15 23:33:39.580 8190-8413: Ulp backup completed
09-15 23:38:37.517 8190-8410: Ulp backup completed

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

Вы можете использовать следующий метод: enqueueUniquePeriodicWork() и реализовать его так:

WorkManager.getInstance().enqueueUniquePeriodicWork("YOUR_TAG", ExistingPeriodicWorkPolicy.KEEP, workRequest);

Обратите внимание, что второй параметр является ключевым.Перечисление может быть KEEP или REPLACE

0 голосов
/ 19 сентября 2018

Я думаю, что опоздал, чтобы ответить на этот вопрос, и вы, возможно, тоже его подправили .. Но я все равно пытаюсь помочь ..

Единственное, чего я не понимаю, это то, что каждый раз, когда задание выполняется несколько раз, can someone explain почему и как я могу этого избежать?

Объяснение:

Все будут шокированы, если я скажу:

  1. Googles android не контролирует кроры процессов, запущенных в режиме реального времени
  2. Даже не хватает понимания, даже если процесс xyz завершен? или работает? или закончил?
  3. Вот и все. И результатом является ваша проблема

Боже мой .. Это приведет к data-loss, если я буду выполнять какие-либо операции с базой данных, тогда .. !! ??

Да, это приводит к потере данных много раз ..

Есть ли у андроида и разработчиков какая-нибудь работа вокруг ...?

Да, предпочитаю использовать IntentService.

Что такого особенного в IntentService?

Если intentservice уже запущен и даже если thousands раз он вызывается ... Тогда и в этом случае тоже ... все вызовы сохраняются в queue андроидом и обрабатываются one by one и one after another и после того, как один finished, тогда только другой ждет awakes и начинает его выполнять

Надеюсь, это поможет.

...