Как наблюдать за живыми данными в диспетчере работ с цепочкой работ?

У меня есть 3 задачи A, B и C. Я хочу наблюдать за данными в реальном времени для этой цепочки и иметь индикатор выполнения, который показывает, что работа выполняется, и когда работа будет завершена, он должен отключить индикатор выполнения.

    // One Time work for A class
         OneTimeWorkRequest Awork = new OneTimeWorkRequest
                          .Builder(A.class)
                          .setConstraints(Miscellaneous.networkConstraint())
                          .addTag("A")
                          .build();
            //same for B and C
            //work chain 
           WorkContinuation syncChain = WorkManager.getInstance()
                              .beginWith(Awork)
                              .then(Bwork)
                              .then(Cwork);

         syncChain.enqueue();

person Ravi Parmar    schedule 04.12.2018    source источник


Ответы (3)


Вы можете использовать метод mWorkManager.getWorkInfosByTagLiveData(TAG_OUTPUT); для восстановления статуса вашего WorkRequest, как показано в WorkManager codelab.

Это позволяет вам получить статус из WorkRequest как перечисление WorkInfo.State со следующими возможными состояниями:

  • ЗАБЛОКИРОВАНО
  • ОТМЕНЕН
  • ЗАСЛУЖИВАЕТСЯ
  • НЕ УДАЛОСЬ
  • БЕГ
  • УСПЕШНО

Однако я не уверен, что это дает вам достаточно детализации для управления индикатором выполнения.

Получение информации, как я написал выше, дает вам гибкость для получения WorkInfo для каждого WorkRequest.
В качестве альтернативы вы можете получить список WorkInfo для _ 3_:

public abstract LiveData<List<WorkInfo>> getWorkInfosLiveData 
person pfmaggi    schedule 04.12.2018
comment
Как поставить отметку в WorkContinuation? У меня есть 3 задачи с 3 разными именами тегов, которые затем добавляются в цепочку. Итак, должен ли я иметь общее имя тега для всех трех задач, а затем добавить его в workmanager? @pfmaggi - person Ravi Parmar; 05.12.2018
comment
Для WorkContinuations вы можете напрямую использовать их getWorkInfosLiveData метод для получения списка WorkInfo: developer.android.com/reference/androidx/work/ Я обновлю ответ, добавив эту ссылку. - person pfmaggi; 05.12.2018
comment
@pfmaggi Мне просто интересно, как LiveData связана с WorkManager? - person Rahul Matte; 23.07.2020
comment
WorkManager интегрирует поддержку LiveData: это то, как вы получаете наблюдаемое для вашей WorkInfo. - person pfmaggi; 24.07.2020

Просто чтобы проиллюстрировать ответ быстрым примером

final int TASK_COUNT = 4;
mProgressBar = findViewById(R.id.progressbar);
mProgressBar.setMax(TASK_COUNT);

// One Time work for A class
OneTimeWorkRequest Awork = new OneTimeWorkRequest
              .Builder(A.class)
              .setConstraints(Miscellaneous.networkConstraint())
              .addTag("A")
              .build();
//same for B and C
//work chain 
WorkContinuation syncChain = WorkManager.getInstance()
                  .beginWith(Awork)
                  .then(Bwork)
                  .then(Cwork);

syncChain.enqueue();

syncChain.getWorkInfosLiveData().observe(this, new Observer<List<WorkInfo>>() {
    @Override
    public void onChanged(List<WorkInfo> workInfos) {

        int finishedCount = 0;

        for (WorkInfo workInfo : workInfos) {
            if (workInfo.getState().isFinished() && workInfo.getState() == WorkInfo.State.SUCCEEDED) {
                finishedCount++;
            }
        }
        mProgressBar.setProgress(finishedCount);

        if (finishedCount == workInfos.size()) {
             mProgressBar.setEnabled(false);
        }
    }
});
person Zain    schedule 08.12.2019

Вы можете использовать интерфейс «Operation», возвращаемый методом enqueue (), который имеет два метода getState () и getResult ().

fun enqueue(requests: List<WorkRequest>): Operation
fun cancelWorkById(id: UUID): Operation

interface Operation{
     fun getState(): LiveData<Operation.State>
     fun getResult(): ListenableFuture<Operation.State.SUCCESS>
}

Вы можете использовать функцию getState () для отслеживания прогресса и промежуточных состояний, а функция getResult () будет возвращать только состояния терминала. т.е. успех или неудача.

person Sonu Sanjeev    schedule 15.01.2019