Android中的WorkManager执行doWork()方法超过一次

5

我正在使用WorkManager来安排一些任务,但问题是在单个调用中,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;

}

这是一个Activity(活动)

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
2个回答

10

当您enqueue一个PeriodicWorkRequest时,并不会取消您之前已经加入的任何现有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);

0

关于使用版本1.0.0-beta01的OneTimeWorkRequest

WorkManager.getInstance()
            .beginUniqueWork("Unique", ExistingWorkPolicy.KEEP, oneTimeWorkRequest)
            .enqueue();

取消现有的序列并用新序列替换它。
保留现有的序列并忽略您的新请求。
将您的新序列附加到现有序列中,在现有序列的最后一个任务完成后运行新序列的第一个任务。
官方文档。https://developer.android.com/topic/libraries/architecture/workmanager/advanced

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接