【发布时间】:2019-08-10 09:13:21
【问题描述】:
我有一个 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提交一个作业,怎么会有两个作业同时运行?
【问题讨论】:
标签: android android-workmanager android-threading