如何解决工作经理的多实例问题?

Ara*_*fat 6 android android-service android-studio-3.0 android-workmanager

我有一个工人要做定期任务。并且在创建活动中调用此工作者。每次活动打开时都会创建一个新实例,并在同一时间多次执行相同的任务。我这样称呼任务

task = new PeriodicWorkRequest.Builder(BackgroundTask.class, 1000000, TimeUnit.MILLISECONDS).build();
WorkManager.getInstance().enqueue(task);
Run Code Online (Sandbox Code Playgroud)

如何避免创建多个实例?如果没有工作人员在运行,我需要在创建活动时调用实例。

Re'*_*'em 10

您可以使用有趣的WorkManager.enqueueUniquePeriodicWork

这个函数需要3个参数:

  1. tag (string) 所以它会寻找其他以前创建的带有这个标签的工作请求
  2. strategy在查找以前创建的其他工作请求时使用。您可以替换以前的工作或保留它
  3. 你的新 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())

}
Run Code Online (Sandbox Code Playgroud)


小智 0

您可以向 WorkRequest 添加标签(使其唯一),然后通过标签检查其状态,并在需要时取消。或者你可以使用getId()方法,因为它是自动生成的,并使用这个id取消。但是这样你应该自己保存这个id。

或者,例如,您可以使用beginUniqueWork(...)方法

https://developer.android.com/reference/androidx/work/WorkManager