如何使用 androidx.work.WorkManager 观察 Chained work 中所有阶段的 LiveData<WorkInfo>

How to observe LiveData<WorkInfo> of all stages in Chained work with androidx.work.WorkManager

我正在调查 androidx.work.WorkManager 当前的 Android 申请。

我正在使用

implementation 'android.arch.work:work-runtime:1.0.0-rc01'

我正在尝试安排链式工作并观察每个直播阶段的 LiveData<WorkInfo>

我看不出如何实现。

我当前的代码类似于:-

public LiveData<WorkInfo> syncAll() {
    final OneTimeWorkRequest stageOne = new OneTimeWorkRequest.Builder(Stage_0001.class).addTag(STAGE_1_IN_PROGRESS_TAG).build();
    final OneTimeWorkRequest stageTwo = new OneTimeWorkRequest.Builder(Stage_0002.class).addTag(STAGE_2_IN_PROGRESS_TAG).build();
    final OneTimeWorkRequest stageThree = new OneTimeWorkRequest.Builder(Stage_0003.class).addTag(STAGE_3_IN_PROGRESS_TAG).build();
    final OneTimeWorkRequest stageFour = new OneTimeWorkRequest.Builder(Stage_0004.class).addTag(STAGE_4_IN_PROGRESS_TAG).build();
    mWorkManager.beginUniqueWork(CHAINED_UNIQUE_NAME, ExistingWorkPolicy.KEEP, stageOne).then(stageTwo).then(stageThree).then(stageFour).enqueue();
    return mWorkManager.getWorkInfoByIdLiveData(stageOne.getId());
}

我的观察者只接收 stageOne 更新。

如果我改成

public LiveData<List<WorkInfo>>  syncAll() {
    final OneTimeWorkRequest stageOne = new OneTimeWorkRequest.Builder(Stage_0001.class).addTag(STAGE_1_IN_PROGRESS_TAG).build();
    final OneTimeWorkRequest stageTwo = new OneTimeWorkRequest.Builder(Stage_0002.class).addTag(STAGE_2_IN_PROGRESS_TAG).build();
    final OneTimeWorkRequest stageThree = new OneTimeWorkRequest.Builder(Stage_0003.class).addTag(STAGE_3_IN_PROGRESS_TAG).build();
    final OneTimeWorkRequest stageFour = new OneTimeWorkRequest.Builder(Stage_0004.class).addTag(STAGE_4_IN_PROGRESS_TAG).build();
    mWorkManager.beginUniqueWork(CHAINED_UNIQUE_NAME, ExistingWorkPolicy.KEEP, stageOne).then(stageTwo).then(stageThree).then(stageFour).enqueue();
    return mWorkManager.getWorkInfosByTagLiveData(CHAINED_UNIQUE_NAME);
}

我的观察者收到一个 WorkInfo 空列表的更新。

如何观察链式 worker 序列的每个阶段?

我找到了解决方法如下:-

        public LiveData<List<WorkInfo>>  syncAll() {
            final OneTimeWorkRequest stageOne = new OneTimeWorkRequest.Builder(Stage_0001.class).addTag(STAGE_1_IN_PROGRESS_TAG).build();
            final OneTimeWorkRequest stageTwo = new OneTimeWorkRequest.Builder(Stage_0002.class).addTag(STAGE_2_IN_PROGRESS_TAG).build();
            final OneTimeWorkRequest stageThree = new OneTimeWorkRequest.Builder(Stage_0003.class).addTag(STAGE_3_IN_PROGRESS_TAG).build();
            final OneTimeWorkRequest stageFour = new OneTimeWorkRequest.Builder(Stage_0004.class).addTag(STAGE_4_IN_PROGRESS_TAG).build();
            final WorkContinuation workContinuation = mWorkManager.beginUniqueWork(CHAINED_UNIQUE_NAME, ExistingWorkPolicy.KEEP, stageOne).then(stageTwo).then(stageThree).then(stageFour);
            final LiveData<List<WorkInfo>> workInfos = workContinuation.getWorkInfosLiveData();
            workContinuation.enqueue();

            return workInfos;
        }

不过,我确信必须有更优雅的方法来实现我想要的结果。

getWorkInfosByTagLiveData 不是正确的方法。您正在排队一项独特的工作,这意味着您需要调用 getWorkInfosForUniqueWorkLiveData。您正在调用的其他方法也适用于这种情况。