Как наблюдать за WorkManager во время изменения конфигурации? - PullRequest
0 голосов
/ 15 ноября 2018

Я исследую использование 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());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...