我正在调查在当前的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,但是这种方法给出了更差的结果,因为我的观察者仅收到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());
}