【问题标题】:WorkManager PeriodicWorkRequest run twiceWorkManager PeriodicWorkRequest 运行两次
【发布时间】:2020-06-17 20:57:22
【问题描述】:

我有一个应用程序每 15 分钟运行一次数据库刷新。

PeriodicWorkRequest 在我的主要活动的 onCreate 中排队。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    updateDatabasePeriodically();


public void updateDatabasePeriodically() {
    PeriodicWorkRequest updateDatabaseRequest =
            new PeriodicWorkRequest.Builder(UpdateDatabaseWorker.class, 15, TimeUnit.MINUTES).build();

    WorkManager.getInstance(getMainActivityContext()).enqueue(updateDatabaseRequest);
}

UpdateDatabaseWorker:

@Override
public Result doWork() {
    // Do the work here--in this case, upload the images.


    updateDatabase();
    // Indicate whether the task finished successfully with the Result
    return Result.success();
}

private void updateDatabase() {
    AppDatabase appDatabase = AppDatabase.getInstance(context);

    Log.i(TAG, "Updating alerts at: " + DateTimeHelper.getHumanReadableTime(now));
}

问题是每次执行作业时都会完成两次工作,从我的日志语句可以看出

2019-11-22 10:20:23.185 24987-25085/com.package.myapp I/com.package.myapp.UpdateDatabaseWorker: Updating at: 22/11/2019 10:20:23
2019-11-22 10:21:30.510 25309-25408/com.package.myapp I/com.package.myapp.UpdateDatabaseWorker: Updating at: 22/11/2019 10:21:30

2019-11-22 10:34:49.642 25309-26180/com.package.myapp I/com.package.myapp.UpdateDatabaseWorker: Updating at: 22/11/2019 10:34:49
2019-11-22 10:35:23.372 25309-26198/com.package.myapp I/com.package.myapp.UpdateDatabaseWorker: Updating at: 22/11/2019 10:35:23

为什么会这样?我应该在其他地方创建请求吗?

这是一个好的解决方案吗? https://stackoverflow.com/a/53059601/9137086

我觉得这是治疗症状而不是治疗疾病

【问题讨论】:

  • 这些很可能是您之前已安排但未取消的任务。第一个和第四个日志似乎是一个重复的工作(约 15 分钟增量) - 其他日志很可能来自您活动中以前的 onCreates。如果正在进行中,您可能必须保存 requestId 以跟踪。引用的答案似乎是一个好方法。
  • 好的,我将实施引用的答案并继续下去,除非/直到建议另一种解决方案

标签: android android-workmanager


【解决方案1】:

在这种情况下,请使用 uniqueWorkRequest,否则(尤其是 PeriodicWorkRequest)您将得到重复。

public void updateDatabasePeriodically() {
    PeriodicWorkRequest updateDatabaseRequest =
            new PeriodicWorkRequest.Builder(UpdateDatabaseWorker.class, 15, TimeUnit.MINUTES).build();

    WorkManager.getInstance(getMainActivityContext())
        .enqueueUniquePeriodicWork("uniqueWorkName", 
                           ExistingPeriodicWorkPolicy.KEEP,
                           updateDatabaseRequest);
}

您可以查看WorkManager#enqueueUniqueWork 的参考以获取有关通话的更多信息,并查看ExistingPeriodicWorkPolicy 以查看哪些选项。

如果您没有使用 REPLACE 的要求,请使用 KEEP,它更便宜并且避免停止已经工作的工作。

【讨论】:

  • 我不得不使用enqueueUniquePeriodicWork() 而不是enqueueUniqueWork()
  • 谢谢!你说得对,我更新了代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多