我有一个 android 应用程序需要在后台执行一些长时间运行的图像处理(处理它的很多块)
- 我使用 WorkManager 来执行任务
- 我使用用户通知来通知进度
版本
- API 级别 28
- 手机跑奥利奥
androidx.work:work-runtime:2.1.0
WorkManager 设置如下(简化代码)
@NonNull
@Override
public Result doWork() {
// 1 Create a NotificationChannel with unique ID
// 2 read params from getInputData
// 3 create as many instances of a class
// that extends Callable<String> as there are small subtasks
// 4 add all these tasks to a ThreadPoolExecutor and call
// invokeAll() which blocks the main Worker thread as required
// by the WorkManager API
// 5 Everytime a subtask finishes, update the notification progress
}
@Override
public void onStopped(){
// Call .shutDown() on the ThreadPoolExecutor
}
作品本身使用以下参数提交
WorkManager mWorkManager = WorkManager.getInstance(context);
Data input = new Data.Builder()
.putString(PARAM_IN_DTO, dto.toString())
.build();
OneTimeWorkRequest mRequest = new OneTimeWorkRequest
.Builder(ExtractorWorker.class)
.setInputData(input)
.addTag(dto.mapName)
.build();
mWorkManager.enqueueUniqueWork(
WORK_NAME,
ExistingWorkPolicy.KEEP,
mRequest);
正如WORK_NAME
上面的代码所独有的,我希望永远不会有两个任务同时运行(注意我尝试过ExistingWorkPolicy.REPLACE
- 相同的问题)
作业正确启动,通知中的进度开始更新。过了一会儿,任务似乎又开始了,而前一个任务仍在运行。我从在两个状态之间切换的唯一通知中看到了这一点(通知年龄now
和上一个年龄之间的时间,以及 0% 和上一个进度之间的进度)。现在显然有两个任务会更新相同的通知。我通过设置一个随机通知 ID 而不是唯一的 ID 来确认这一点,然后出现了两个通知,每个通知都过着自己的生活。
我想知道
- 为什么 WorkManager 会在前一个任务仍在运行并且我没有从应用程序请求任何内容时再次提交此任务
- 如果我只提交一个,怎么可能同时运行两个作业
enqueueUniqueWork