我有一名定期工作的工人,每15分钟执行一次。工作人员将数据文件上传到服务器。但是,当当前工作人员花时间上载并仍在运行时,工作管理器会在10分钟后调用工作程序,但会在10分钟后调用该工作程序,这会导致问题,因为他们俩都试图访问数据库并互相覆盖。当当前工作程序仍在运行时,有什么方法可以阻止工作程序在10分钟后被调用。
我正在使用2.3.0-alpha03版本。
谁能帮忙吗?
我会尝试将工作线程放在同一后台线程上,因此工作请求将一个接一个地排队。
WorkManager.initialize(
context,
new Configuration.Builder()
.setExecutor(Executors.newFixedThreadPool(1))
.build());
您可以阅读有关线程和WorkManager here的更多信息
如果约束使工作请求无法运行,则您应该能够对周期性工作程序使用相等约束,请在oneTimeWorker运行之前将相等状态设置为false,在工作完成之后将相等状态设置为true。
private boolean RUN_WORKER = true;
Constraints constraints = new Constrains.Builder()
.equals(RUN_WORKER)
.build
PeriodicWorkRequest request =
new PeriodicWorkRequest.Builder(myPeriodicWorker.class, 10, TimeUnit.MINUTES)
.setConstraints(constraints)
.build();
WorkManager.getInstance(myContext)
.enqueue(request);
运行OneTimeWorker的方法
RUN_WORKER = false;
OneTimeWorkRequest request = new OneTimeWorkResquest =
new OneTimeWorkRequest.Builder(OneTimeWorker.class)
.build();
WorkManager.getInstance(mContext).getWorkInfoByIdLiveData(request.getId())
.observe(lifecycleOwner, new Observer<WorkInfo>() {
@Override
public void onChanged(@Nullable WorkInfo workInfo) {
if (workInfo != null && workInfo.state == WorkInfo.State.SUCCEEDED) {
displayMessage("Work finished!")
}
RUN_WORKER = true;
}
});