如何使用工作链观察工作管理器中的实时数据?
How to Observe the live data in work manager with chain of works?
我有 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();
您可以使用 mWorkManager.getWorkInfosByTagLiveData(TAG_OUTPUT);
方法恢复 WorkRequest 的状态,如 WorkManager codelab 中所示。
这允许您从 WorkRequest 中检索状态作为 'WorkInfo.State' 枚举,具有这些可能的状态:
- 已屏蔽
- 已取消
- 排队
- 失败
- 运行
- 成功
但是,我不确定这是否为您提供了足够的粒度来管理进度条。
如上文所述检索信息使您可以灵活地检索每个 WorkRequest 的 WorkInfo。
作为替代方案,您可以为 WorkContinuation
:
检索 WorkInfo
的列表
public abstract LiveData<List<WorkInfo>> getWorkInfosLiveData
只是为了用一个简单的例子来说明答案
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);
}
}
});
我有 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();
您可以使用 mWorkManager.getWorkInfosByTagLiveData(TAG_OUTPUT);
方法恢复 WorkRequest 的状态,如 WorkManager codelab 中所示。
这允许您从 WorkRequest 中检索状态作为 'WorkInfo.State' 枚举,具有这些可能的状态:
- 已屏蔽
- 已取消
- 排队
- 失败
- 运行
- 成功
但是,我不确定这是否为您提供了足够的粒度来管理进度条。
如上文所述检索信息使您可以灵活地检索每个 WorkRequest 的 WorkInfo。
作为替代方案,您可以为 WorkContinuation
:
WorkInfo
的列表
public abstract LiveData<List<WorkInfo>> getWorkInfosLiveData
只是为了用一个简单的例子来说明答案
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);
}
}
});