我正在使用work manager调度一些任务,但问题是workmanager在一次调用中多次执行这些任务{dowwork()}。
我正在使用:
'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
最佳答案
当您enqueue
aPeriodicWorkRequest
时,这不会取消您以前排队的任何现有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);