Android中的WorkManger多次执行doWork()

时间:2018-09-24 20:59:42

标签: android jobs schedule android-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;

}

这是活动

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 个答案:

答案 0 :(得分:1)

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);

答案 1 :(得分:0)

对于使用1.0.0-beta01版本的OneTimeWorkRequest

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

取消现有序列,并用新序列替换。
保留现有序列并忽略您的新请求。
将新序列附加到现有序列上,在现有序列的最后一个任务完成后运行新序列的第一个任务

官方文档。 https://developer.android.com/topic/libraries/architecture/workmanager/advanced

相关问题