如何使用WorkManager在不立即运行的情况下更改定期工作请求期限?

时间:2018-10-10 03:35:25

标签: android kotlin android-workmanager

val request = PeriodicWorkRequestBuilder<FooWorker>(1, TimeUnit.DAYS).build()
WorkManager.getInstance().enqueueUniquePeriodicWork(
    "FOO",
    ExistingPeriodicWorkPolicy.REPLACE,
    request
)

上面的代码在onCreate的{​​{1}}中运行,以确保请求已入队。但是,这将导致一个问题,Application每次用户启动应用程序时都将运行,因为FooWorker取消了以前的工作并加入了新工作,使它立即运行。

如果我们更改为ExistingPeriodicWorkPolicy.REPLACE,即使期间或工作人员已更改,我们也将无法替换工作。

在当前请求运行之后,是否可以替换请求?

例如,原始请求每天运行1次,而新请求每小时运行1次。在运行下一个原始请求后,将其替换为新请求。

3 个答案:

答案 0 :(得分:3)

无法以一种干净的方式完全完成您的定期工作。

但是,绝对不需要自己进行定期工作。通过在返回doWork之前,在Result.SUCCESS方法的末尾调度下一个WorkRequest可以轻松实现相同的结构:

fun doWork(): Result {
  reallyDoWork()
  // Now schedule the next "periodic" work
  val request = OneTimeWorkRequestBuilder<FooWorker>().build()
  WorkManager.getInstance().enqueueUniqueWork(
    "FOO",
    ExistingWorkPolicy.REPLACE,
    request
  )
  return Result.SUCCESS
}

使用此设置,如果您已经有一个WorkRequest排队,并且您的onCreate()中的Application可以安全地使用ExistingWorkPolicy.KEEP来避免重新安排工作,则当下一个WorkRequest被触发时将排队等待适当的新期限。

答案 1 :(得分:1)

看起来现在有一种方法可以用enqueueUniquePeriodicWork代替定期工作。

deinit

确保您传递的是 val request = PeriodicWorkRequestBuilder<FooWorker>(1, TimeUnit.DAYS).build() WorkManager.getInstance() .enqueueUniquePeriodicWork(WORK_TAG, ExistingPeriodicWorkPolicy.REPLACE, request) 而不是ExistingPeriodicWorkPolicy

答案 2 :(得分:1)

如果要使用ExistingPeriodicWorkPolicy.KEEP并仅在要更改重复间隔时才更新PeriodicWorkRequest,则WorkManager没有解决方案,但是您可以将interval保存在sharedPreferences中,并检查interval是否已更改。并以此为基础使用ExistingPeriodicWorkPolicy.KEEPExistingPeriodicWorkPolicy.REPLACE

public static void enqueue(Context context) {
        Log.d(TAG, "enqueue()");
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
        int repeatInterval = sharedPreferences.getInt("REPEAT_INTERVAL_HOURS", 0);

        PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest
            .Builder(FooWorker.class, REPEAT_INTERVAL_HOURS, TimeUnit.HOURS)
            .build();

        ExistingPeriodicWorkPolicy policy = repeatInterval == REPEAT_INTERVAL_HOURS ? ExistingPeriodicWorkPolicy.KEEP : ExistingPeriodicWorkPolicy.REPLACE;

        sharedPreferences.edit().putInt("REPEAT_INTERVAL_HOURS", REPEAT_INTERVAL_HOURS).apply();

        WorkManager.getInstance(context).enqueueUniquePeriodicWork("fileRemove", policy, periodicWorkRequest);
    }