我正在调查
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观察者的生命周期所有者。
当我允许workManager在不改变测试设备方向的情况下完成其工作时,它会按设计工作。
但是,当我启动workManager,然后在其后台处理期间,我更改了设备方向,当碎片被销毁时,我的观察者将被删除。工作管理器仍然成功完成,因为我可以在我的应用程序日志中看到这一点。。。
WorkerWrapper: Worker result SUCCESS for Work [ id=33058369-010d-4e07-ae94-fb04bcf4d805, tags={ com.sync.SyncWorker, SYNC-IN-PROGRESS-TAG } ]
我转而使用observeForever,但是这种方法给出了更糟糕的结果,因为我的观察者只收到
ENQUEUED
和
RUNNING
,它从未“看到”过
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());
}