在配置更改期间如何观察WorkManager?

时间:2018-11-15 14:07:09

标签: android android-workmanager

我正在调查在当前的Android应用程序中使用androidx.work.WorkManager进行后台工作的情况。

我使用的版本是:-

compileSdkVersion = 27
targetSdkVersion = 27
minSdkVersion = 21
buildToolsVersion = "27.0.3"
supportLibVersion = "27.1.1"

archLifecycleVersion = "1.1.1"
archWorkerRuntimeVersion = "1.0.0-alpha11"

我的应用程序由一个带有片段的活动组成,该片段具有关联的android.arch.lifecycle.AndroidViewModel,而视图模型具有存储库。

我从存储库类中控制WorkManager。

我将片段设置为workManager Observer的LifecycleOwner。

当我允许workManager在不更改测试设备方向的情况下完成其工作时,它将按设计工作。

但是,当我启动workManager并随后在其后台处理期间,由于Fragment已被破坏,因此更改了设备方向,我的观察者也被移除。工作经理仍然成功完成工作,因为我可以在我的应用程序日志中看到它。

WorkerWrapper: Worker result SUCCESS for Work [ id=33058369-010d-4e07-ae94-fb04bcf4d805, tags={ com.sync.SyncWorker, SYNC-IN-PROGRESS-TAG } ]

我改用了observeForever,但是这种方法给出了更差的结果,因为我的观察者仅收到ENQUEUEDRUNNING,尽管我仍然看到,但它从未“看到” SUCCEEDED状态以上WorkerWrapper日志条目。

在设备配置更改之前和之后如何观察WorkManager的工作?

我的代码类似于:-

private WorkManager mWorkManager;

/**
 * SINGLETON
 */
private MyRepository() {
    mWorkManager = WorkManager.getInstance();
}


private static final String WORK_IN_PROGRESS_TAG = "SYNC-IN-PROGRESS-TAG";
private static final String UNIQUE_WORK_NAME = "SYNC-UNIQUE_WORK_NAME";
private final Observer<WorkInfo> workerObserver = constructWorkStatusObserver();

private Observer<WorkInfo> constructWorkStatusObserver() {
    return workInfo -> {

        if (workInfo == null) {
            return;
        }

        if (workInfo.getState().equals(WorkInfo.State.SUCCEEDED)) {
            //DO SOMETHING 
        } else if (workInfo.getState().equals(WorkInfo.State.FAILED)) {
            Log.e(TAG, "SyncWorker FAILED:");
        }
    };
}


private Action manageSuccess(final LifecycleOwner lifecycleOwner) {
    return () -> {
        final LiveData<WorkInfo> workStatus = constructWorkRequest();
        workStatus.observe(lifecycleOwner, workerObserver);
    };
}

private LiveData<WorkInfo> constructWorkRequest() {
    final OneTimeWorkRequest refreshDatabaseWork = new OneTimeWorkRequest.Builder(SyncWorker.class).addTag(WORK_IN_PROGRESS_TAG).build();

    mWorkManager.beginUniqueWork(UNIQUE_WORK_NAME, ExistingWorkPolicy.KEEP, refreshDatabaseWork).enqueue();
    return mWorkManager.getWorkInfoByIdLiveData(refreshDatabaseWork.getId());
}

0 个答案:

没有答案