WorkManager,doWork()会无意中被两次调用相同的ID

时间:2019-06-18 15:05:06

标签: android-workmanager

WorkManager执行两次doWork()。即使在使用.enqueueUniquePeriodicWork()时,我也会得到具有相同ID的重复项,这些ID可以并行运行。

我的自定义约束条件仅允许在屏幕关闭时进行工作,但在满足条件时进行两次。

我试图取消并修剪所有先前存在的工作,但是doWork()仍然被调用两次。

按钮被单击->

           Log.i("[Worker]","Start");
            // Change every 15 minutes.

            PeriodicWorkRequest.Builder builder = new PeriodicWorkRequest.Builder(Worker.class, 15, TimeUnit.MINUTES);
            builder.setConstraints(Constraints.NONE);
            builder.setBackoffCriteria(BackoffPolicy.LINEAR,30,TimeUnit.SECONDS);
            builder.addTag("loader");

            PeriodicWorkRequest request = builder.build();
            // cancel all work
            WorkManager.getInstance().cancelAllWork();
            // clear all finished or cancelled tasks from the WorkManager
            WorkManager.getInstance().pruneWork();
            // Start PeriodicWork
            WorkManager.getInstance().enqueueUniquePeriodicWork(request.getId().toString(),REPLACE,request);

// Worker.java

public Worker.Result doWork() {
    // Print workId
    // Is screen on
    PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);

    boolean isScreenOn = pm.isInteractive();

    int r = getRunAttemptCount()+1;

    if (!isScreenOn) {
        Log.i("[Worker]", "workId: " + getId());
        // CODE
    } else if (isScreenOn) {
        Log.i("[Worker]","Fail: Retry "+r);
       return Result.retry();
    }
    return Result.success();
}

Log.i: 时间:16:23:00.634 [工作者]:开始
时间:16:23:00.963 [工作者]:失败:重试1
时间:16:23:31.052 [Worker]:workId:90369ace-2e0b-4398-8cf1-6e5c3cd306c5
时间:16:23:31.168 [Worker]:workId:90369ace-2e0b-4398-8cf1-6e5c3cd306c5

依赖性{
    def work_version =“ 2.0.1”
    实现“ androidx.work:工作运行时:$ work_version”
}

1 个答案:

答案 0 :(得分:0)

这些不是并行运行的。您的工作会在应用启动时立即运行,因为正在重试。同时,您尝试取消它并立即运行一个新的。您可以看到时间戳不同。