如何使用WorkManager和Work链观察实时数据?

5

我有三件任务: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();
2个回答

7

只是为了用一个快速的例子来说明答案。

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);
        }
    }
});

5
您可以使用mWorkManager.getWorkInfosByTagLiveData(TAG_OUTPUT);方法来恢复您的WorkRequest的状态,如WorkManager codelab中所示。
这使您可以将WorkRequest的状态作为“WorkInfo.State”枚举检索,其可能的状态如下:
- BLOCKED - CANCELLED - ENQUEUED - FAILED - RUNNING - SUCCEEDED
但是,我不确定这是否足以给您管理进度条带来足够的细粒度。
按照上述方式检索信息可以让您灵活地检索每个WorkRequest的WorkInfo。
作为替代方案,您可以检索WorkContinuationWorkInfo列表。
public abstract LiveData<List<WorkInfo>> getWorkInfosLiveData 

如何给“WorkContinuation”打标签?我有3个任务,每个任务都有不同的标签名称,然后将它们添加到链中。所以,我应该为所有三个任务使用一个公共标签名称,然后将其添加到workmanager中吗?@pfmaggi - Ravi Parmar
1
对于 WorkContinuations,您可以直接使用它们的 getWorkInfosLiveData 方法来检索 WorkInfo 列表: https://developer.android.com/reference/androidx/work/WorkContinuation#getWorkInfosLiveData()我会更新回复并添加此参考。 - pfmaggi
@pfmaggi,我只是想知道LiveData如何与WorkManager相关联? - Rahul Matte
WorkManager集成了对LiveData的支持:这是您获取WorkInfo可观察对象的方式。 - pfmaggi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接