Android WorkManager разветвляется на несколько цепочек и присоединяется - PullRequest
0 голосов
/ 23 января 2020

Я хочу настроить следующую работу с помощью WorkManager:

   A
   |
   v
 -----
|     |
v     |
B     v
|     D
v     |
C     |
|     |
 -----
   |
   v
   E

Итак, сначала должен выполняться A, затем B, затем C, в то время как D работает параллельно. После этого должен запуститься E.

Соединение двух параллельных цепочек перед запуском E можно выполнить с помощью WorkContinuation.combine(). Моя проблема в том, что я не могу понять, как сделать разветвление на две параллельные цепи после A. (Было бы просто, если бы левая цепочка, содержащая B и C, не была действительной цепочкой из двух запросов, а только одного запроса.)

1 Ответ

1 голос
/ 25 января 2020

Как вы писали, цепочку, которую вы хотите построить, невозможно реализовать с помощью WorkManager. Вы можете открыть запрос на функцию на Issetraracker WorkManager .

Возвращаясь к вашей цепочке, мне интересно, может ли она быть изменена для соответствия API WorkManager:

   A
   |
   v
 -----
|     |
v     |
B     v
|     D
|     |
 -----
   |
   v
   C
   |
   v
   E

В этом случае вам нужно обработать с помощью logi c входное слияние с C, чтобы оно выполняло то, что вы ожидаете, это, если у вас есть данные, передаваемые между Worker классами . Но вы сохраняете те же ограничения (но в этом случае C требует, чтобы вы завершили D до его запуска).

В этом случае, следуя документации WorkManager , вы можете иметь что-то вроде:

        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()
...