Я исследую использование androidx.work.WorkManager
для фоновой работы в моем текущем приложении Android.
Используемые мной версии: -
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 из своего класса репозитория.
Я установил фрагмент как LifecycleOwner для workManager Observer.
Когда я позволяю workManager завершить свою работу, не меняя ориентацию моего тестирующего устройства, он работает, как задумано.
Однако, когда я запускаю workManager, а затем во время его фоновой обработки меняю ориентацию устройства, мой наблюдатель удаляется, поскольку фрагмент был уничтожен. Диспетчер работ по-прежнему завершается успешно, как я вижу в журналах приложений ...
WorkerWrapper: Worker result SUCCESS for Work [ id=33058369-010d-4e07-ae94-fb04bcf4d805, tags={ com.sync.SyncWorker, SYNC-IN-PROGRESS-TAG } ]
Я переключился на использование наблюдающего больше, но этот подход дал худшие результаты, так как мой наблюдатель только получал 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());
}