如何使用工作链观察工作管理器中的实时数据?

Rav*_*mar 4 android android-livedata android-workmanager

我有 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();
Run Code Online (Sandbox Code Playgroud)

pfm*_*ggi 5

您可以使用该mWorkManager.getWorkInfosByTagLiveData(TAG_OUTPUT);方法恢复 WorkRequest 的状态,如WorkManager codelab 中所示。

这允许您从 WorkRequest 检索状态作为具有以下可能状态的“WorkInfo.State”枚举:

  • 已屏蔽
  • 取消
  • 入队
  • 失败的
  • 跑步
  • 成功

但是,我不确定这是否为您提供了足够的粒度来管理进度条。

检索我上面写的信息使您可以灵活地检索每个 WorkRequest 的 WorkInfo。
作为替代,你可以检索列表WorkInfoWorkContinuation

public abstract LiveData<List<WorkInfo>> getWorkInfosLiveData 
Run Code Online (Sandbox Code Playgroud)


Zai*_*ain 5

只是为了用一个简单的例子来说明答案

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);
        }
    }
});
Run Code Online (Sandbox Code Playgroud)