Kotlin // UUID 方式 val workId: UUID = oneTimeWorker.getId() WorkManager.getInstance().cancelWorkById(workId)
// Tag 方式 val oneTimeWorker = OneTimeWorkRequest.Builder(TestWorker::class.java) .addTag("myTag") .build() WorkManager.getInstance().cancelAllWorkByTag("myTag")
// A, B, C 就会按顺序执行, 如果全部返回成功或者某一个返回失败, 那该任务链就会结束. WorkManager.getInstance() .beginWith(workA) .then(workB) .then(workC) .enqueue()
// A, B 一起运行, 虽然这2个的开始顺序不定, 但是 C 一定是在这2个运行后才运行. WorkManager.getInstance() .beginWith(Arrays.asList(workA, workB)) .then(workC) .enqueue() // B 一定会在 A 后面运行, D 也一定会在 C 后面运行, 但是 AB 与 CD 这两条链的运行顺序不定, 但是 E 一定是在 B 和 D 都结束后才运行. val chain1 = WorkManager.getInstance() .beginWith(workA) .then(workB) val chain2 = WorkManager.getInstance() .beginWith(workC) .then(workD) val chain3 = WorkContinuation .combine(Arrays.asList(chain1, chain2)) .then(workE) chain3.enqueue()
// A, B, C 就会按顺序执行, 如果全部返回成功或者某一个返回失败, 那该任务链就会结束. WorkManager.getInstance() .beginWith(workA) .then(workB) .then(workC) .enqueue();
// A, B 一起运行, 虽然这2个的开始顺序不定, 但是 C 一定是在这2个运行后才运行. WorkManager.getInstance() .beginWith(Arrays.asList(workA, workB)) .then(workC) .enqueue(); // B 一定会在 A 后面运行, D 也一定会在 C 后面运行, 但是 AB 与 CD 这两条链的运行顺序不定, 但是 E 一定是在 B 和 D 都结束后才运行. WorkContinuation chain1 = WorkManager.getInstance() .beginWith(workA) .then(workB); WorkContinuation chain2 = WorkManager.getInstance() .beginWith(workC) .then(workD); WorkContinuation chain3 = WorkContinuation .combine(Arrays.asList(chain1, chain2)) .then(workE); chain3.enqueue();
相同任务的重复策略
前面提到对于 Worker 来说, 可以通过 UUID 和 Tag 来保证其唯一性, 这样在需要的时候就可以避免任务重复执行. 但对于连续的任务链, 如果任务多了, 这样的方式会很繁琐. 于是, WorkerManager 也提供了相应的 API 来保证其唯一性.
overridefundoWork(): Result { val first = inputData.getInt("KEY_FIRST", 0) val second = inputData.getInt("KEY_SECOND", 0) val result = first + second // 1 + 2 = 3 val output = Data.Builder() .putInt("KEY_RESULT", result) .build() return Result.success(output) } }
// 监听返回 WorkManager.getInstance().getWorkInfoByIdLiveData(worker.id) .observe(this, Observer { info -> if (info != null && info.state.isFinished) { // 获取返回结果, 应该是3 val result = info.outputData.getInt("KEY_RESULT", 0) } })
@NonNull @Override public Result doWork(){ int first = getInputData().getInt("KEY_FIRST", 0); int second = getInputData().getInt("KEY_SECOND", 0); int result = first + second; // 1 + 2 = 3 Data output = new Data.Builder() .putInt("KEY_RESULT", result) .build(); return Result.success(output); } }
// 监听返回 WorkManager.getInstance().getWorkInfoByIdLiveData(worker.getId()) .observe(lifecycleOwner, info -> { if (info != null && info.getState().isFinished()) { // 获取返回结果, 应该是3 int result = info.getOutputData().getInt(KEY_RESULT, 0)); } });