'Android WorkManager fork single into multiple chains and join
I want to set up the following work using WorkManager:
A
|
v
-----
| |
v |
B v
| D
v |
C |
| |
-----
|
v
E
So first, A
should should run, then B
followed by C
while D
runs in parallel. After that, E
should run.
Joining the two parallel chains before running E
can be done with WorkContinuation.combine()
. My problem is that I cannot figure out how to do the forking into two parallel chains after A
. (It would be simple if the left chain containing B
and C
wasn't an actual chain of two requests but only a single request.)
Solution 1:[1]
As you wrote, the chain you want to build is not possible to implement with WorkManager. You can open a feature request on WorkManager's issuetracker.
Going back to your chain, I wonder if it can be modified to fit into WorkManager API:
A
|
v
-----
| |
v |
B v
| D
| |
-----
|
v
C
|
v
E
In this case you need to handle with some logic the input merger into C
so that it does what you expect, this if you have data passed between the Worker
classes. But you maintain the same constraints (but in this case C
requires that you terminate D
before it is started).
In this case, following WorkManager's documentation, you can have something like:
val workRequestA = OneTimeWorkRequestBuilder<SaveImageToFileWorker>().build()
val workRequestB = OneTimeWorkRequestBuilder<SaveImageToFileWorker>().build()
val workRequestC = OneTimeWorkRequestBuilder<SaveImageToFileWorker>()
.setInputMerger(ArrayCreatingInputMerger::class.java)
.build()
val workRequestD = OneTimeWorkRequestBuilder<SaveImageToFileWorker>().build()
val workRequestE = OneTimeWorkRequestBuilder<SaveImageToFileWorker>().build()
var continution = workManager
.beginWith(workRequestA)
.then(listOf(workRequestB, workRequestD))
.then(workRequestC)
.then(workRequestE)
.enqueue()
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | pfmaggi |