Android Worker多次执行该作业

问题描述 投票:1回答:2

我使用以下代码来安排每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
android android-jobscheduler countdownlatch android-workmanager
2个回答
0
投票

你可以使用以下方法:enqueueUniquePeriodicWork(),并实现如下:

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

请注意第二个参数是关键。枚举可以是KEEPREPLACE


-1
投票

我想我回答这个问题的时间已经很晚了,你也可能已经调整过了..但我还是试着帮助..

我唯一不理解的是,每次工作多次执行时,can someone explain为什么以及如何避免它?

说明:

如果我说的话,每个人都会感到震惊:

  1. Googles android无法控制实时运行的进程
  2. 即使说xyz过程完成,甚至还缺乏理解?还是跑步?还是完了?
  3. 就是这个。结果就是你的问题

哦,我的上帝..如果我正在做任何数据库操作那将导致data-loss .. !! ??

是的,它导致数据丢失很多次..

Android和开发人员有什么工作吗?

是的,更喜欢使用IntentService

IntentService有什么特别之处?

如果intentservice已经运行,即使thousands有时被调用...那么在那种情况下...所有的调用都保存在queue由android和处理one by oneone after another后一个是finished然后只有另一个等待awakes和开始执行它

希望能帮助到你。

© www.soinside.com 2019 - 2024. All rights reserved.