首页 > 解决方案 > Android 中的 WorkManger 多次执行 doWork()

问题描述

我正在使用 WorkManager 来安排一些任务,但问题是工作管理器在一次调用中不止一次执行这些任务 { doWork() }。


我在用:

'android.arch.work:work-runtime:1.0.0-alpha08'

我试过使用-alpha07,06,05,04。但我有同样的问题。有时它甚至一次执行 5-6 次


这是代码:

public class MyWorker extends Worker {

@NonNull
@Override
public Result doWork() {

    Log.i("CountWorker","0");
    sendNotification("Notice", "A notice was sent");
    return Result.SUCCESS;

}

这是活动

public class MyWorkerActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    final PeriodicWorkRequest pwr = new PeriodicWorkRequest
            .Builder(MyWorker.class, 16, TimeUnit.MINUTES)
            .setConstraints(Constraints.NONE)
            .build();

    WorkManager.getInstance().enqueue(pwr);

}
}

这是 Logcat 的结果:

09-24 16:44:35.954 22779-22816/com.simran.powermanagement I/CountWorker: 0
09-24 16:44:35.970 22779-22817/com.simran.powermanagement I/CountWorker: 0
09-24 16:44:35.977 22779-22818/com.simran.powermanagement I/CountWorker: 0

标签: androidjobsscheduleandroid-workmanager

解决方案


当您enqueueaPeriodicWorkRequest时,这不会取消PeriodicWorkRequest您之前排队的任何现有内容。因此,当您编写应用程序时,每次您的活动开始时,您都会添加周期性的工作请求,从 1 到 2 再到 3 慢慢地进行。

您改为使用enqueueUniquePeriodicWork()

此方法允许您将唯一命名的 排队PeriodicWorkRequest,其中一次只能激活一个特定名称的 PeriodicWorkRequest 。例如,您可能只希望一个同步操作处于活动状态。如果有一个待处理,您可以选择让它运行或用您的新工作替换它。uniqueWorkName唯一标识此 PeriodicWorkRequest 。

使用如下代码:

final PeriodicWorkRequest pwr = new PeriodicWorkRequest
        .Builder(MyWorker.class, 16, TimeUnit.MINUTES)
        .setConstraints(Constraints.NONE)
        .build();

WorkManager.getInstance().enqueueUniquePeriodicWork(
    "my_worker",
    ExistingPeriodicWorkPolicy.REPLACE,
    pwr);

推荐阅读