Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在具有工作链的work manager中观察实时数据?_Android_Android Workmanager - Fatal编程技术网

Android 如何在具有工作链的work manager中观察实时数据?

Android 如何在具有工作链的work manager中观察实时数据?,android,android-workmanager,Android,Android Workmanager,我有3个任务A、B和C。我想观察这个链的实时数据,并有一个进度条,显示正在进行的工作,一旦工作完成,它应该禁用进度条 // One Time work for A class OneTimeWorkRequest Awork = new OneTimeWorkRequest .Builder(A.class) .setConstraints(Miscellaneous

我有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(标记输出)方法恢复工作请求的状态,如中所示

这允许您以“WorkInfo.State”枚举的形式从WorkRequest中检索状态,其中包含以下可能的状态:

  • 封锁
  • 取消
  • 排队
  • 失败
  • 运行
  • 成功
但是,我不确定这是否为您提供了足够的粒度来管理进度条

按照我上面所写的方式检索信息,使您能够灵活地检索每个工作请求的工作信息。
或者,您可以为以下内容检索
WorkInfo
列表:

公共抽象LiveData GetWorkInfo视频数据
您可以使用enqueue()方法返回的“操作”接口,该方法有两个方法getState()和getResult()

fun排队(请求:列表):操作
fun cancelWorkById(id:UUID):操作
接口操作{
fun getState():LiveData
fun getResult():ListenableFuture
}

可以使用getState()函数跟踪进度和中间状态,getResult()函数只返回终端状态。成功或失败。

仅用一个简单的例子来说明答案

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);
        }
    }
});
final int TASK_COUNT=4;
mProgressBar=findviewbyd(R.id.progressbar);
mProgressBar.setMax(任务计数);
//一次上课
OneTimeWorkRequest Awork=新OneTimeWorkRequest
.Builder(A.class)
.setConstraint(杂项.networkConstraint())
.addTag(“A”)
.build();
//B和C也一样
//工作链
WorkContinuation syncChain=WorkManager.getInstance()
.从(工作)开始
.然后(b工作)
.然后(工作);
syncChain.enqueue();
syncChain.GetWorkInfo SliveData().observe(这是一个新的观察者(){
@凌驾
更改后的公共无效(列出工作信息){
int finishedCount=0;
用于(工作信息工作信息:工作信息){
if(workInfo.getState().isFinished()&&workInfo.getState()==workInfo.State.successed){
finishedCount++;
}
}
mProgressBar.setProgress(finishedCount);
如果(finishedCount==workInfo.size()){
mProgressBar.setEnabled(false);
}
}
});

如何给“工作继续”添加标签?我有3个任务,3个不同的标签名,然后添加到链中。那么,我是否应该为这三个任务使用一个通用的标记名,然后将其添加到workmanager中@pfmaggi对于WorkContinuations,您可以直接使用其
GetWorkInfo SliveData
方法检索工作信息列表:我将通过添加此引用来更新回复。@pfmaggi我只是想知道LiveData与WorkManager的关联方式?WorkManager集成了对LiveData的支持:这就是如何获得工作信息的可观察性。
fun enqueue(requests: List<WorkRequest>): Operation
fun cancelWorkById(id: UUID): Operation

interface Operation{
     fun getState(): LiveData<Operation.State>
     fun getResult(): ListenableFuture<Operation.State.SUCCESS>
}
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);
        }
    }
});