android - 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
解决方案
当您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);
推荐阅读
- java - Jboss EAP 6.4 与 artemis 的集成
- javascript - 如何在应用脚本中使用相同的渲染从 HTML 中保存 PDF
- linux - 在 bash 提示符中展开完整路径
- javascript - dropzone 在上传前删除 exif 数据
- r - 调查数据进入网络
- sql - 根据sql中的数量列生成序列号
- datetime - sqlalchemy中的时间戳操作
- python - Python中的起点目的地矩阵。需要关于函数调用内部不一致矩阵的建议。SIR 模型为 [5x3],od_flow 为 [5x5]
- timestamp - GoogleSheets 问题的时间戳脚本
- python - 从文本文件读取、修改和写入值