我有一个工人做一个周期性的任务。并且在创建活动中调用此工作程序。每次活动打开时,都会创建一个新实例,并在多个时间内同时执行相同的任务。我这样称呼了这个任务
task = new PeriodicWorkRequest.Builder(BackgroundTask.class, 1000000, TimeUnit.MILLISECONDS).build();
WorkManager.getInstance().enqueue(task);
如何避免创建多个实例?如果没有工作人员在运行,我需要在创建活动时调用实例。
你可以使用有趣的WorkManager.enqueueUniquePeriodicWork
这个功能需要3个参数:
tag
(字符串)所以它会查找此标签的其他先前创建的工作请求strategy
在查找其他先前创建的工作请求时使用。您可以替换以前的工作或保留它work request
例如,在我需要每隔一段时间运行一次位置捕获工作的kotlin项目中,我创建了一个开始这样工作的乐趣:
fun init(force: Boolean = false) {
//START THE WORKER
WorkManager.getInstance()
.enqueueUniquePeriodicWork(
"locations",
if (force) ExistingPeriodicWorkPolicy.REPLACE else ExistingPeriodicWorkPolicy.KEEP,
PeriodicWorkRequest.Builder(
LocationsWorker::class.java,
PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS,
TimeUnit.MILLISECONDS)
.build())
}
您可以将标记添加到WorkRequest(使其唯一),然后按标记检查其状态,并在需要时取消。或者您可以使用getId()
方法,因为它是自动生成的并使用此id取消。但这样您应该自己保存此ID。
或者,例如,您可以使用beginUniqueWork(...)
方法
https://developer.android.com/reference/androidx/work/WorkManager