如何使用androidx.work.WorkManager观察链式工作中所有阶段的LiveData <workinfo>

时间:2019-02-19 13:37:46

标签: android android-workmanager

我正在对当前的Android应用中的androidx.work.WorkManager进行调查。

我正在使用

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 s空列表的更新。

我如何观察工人的一系列工作链的每个阶段?

2 个答案:

答案 0 :(得分:1)

getWorkInfosByTagLiveData是不正确的方法。您正在排队一份独特的作品,这意味着您需要致电getWorkInfosForUniqueWorkLiveData。在这种情况下,您要调用的另一种方法也可以使用。

答案 1 :(得分:0)

我找到了以下解决方案:-

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

我相信必须有一种更优雅的方法才能达到我想要的结果。