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

时间:2018-10-14 06:16:54

标签: android android-service android-studio-3.0 android-workmanager

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

task = new PeriodicWorkRequest.Builder(BackgroundTask.class, 1000000, TimeUnit.MILLISECONDS).build();
WorkManager.getInstance().enqueue(task);

如何避免创建多个实例? 如果没有正在运行的工作程序,则需要在创建活动时调用该实例。

2 个答案:

答案 0 :(得分:2)

您可以使用有趣的WorkManager.enqueueUniquePeriodicWork

此功能需要3个参数:

  1. tag(字符串),以便它将查找带有此标签的其他先前创建的工作请求
  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())

}

答案 1 :(得分:0)

您可以将标签添加到WorkRequest中(使其唯一),然后按标签检查其状态,并在需要时取消。 或者,您可以使用getId()方法,因为它是自动生成的,并且使用此ID可以取消。但是,这种方式您应该自己保存此ID。

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

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