val request = PeriodicWorkRequestBuilder<FooWorker>(1, TimeUnit.DAYS).build()
WorkManager.getInstance().enqueueUniquePeriodicWork(
"FOO",
ExistingPeriodicWorkPolicy.REPLACE,
request
)
上面的代码在onCreate
的{{1}}中运行,以确保请求已入队。但是,这将导致一个问题,Application
每次用户启动应用程序时都将运行,因为FooWorker
取消了以前的工作并加入了新工作,使它立即运行。
如果我们更改为ExistingPeriodicWorkPolicy.REPLACE
,即使期间或工作人员已更改,我们也将无法替换工作。
在当前请求运行之后,是否可以替换请求?
例如,原始请求每天运行1次,而新请求每小时运行1次。在运行下一个原始请求后,将其替换为新请求。
答案 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.KEEP
或ExistingPeriodicWorkPolicy.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);
}