代码之家  ›  专栏  ›  技术社区  ›  Hector

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

  •  0
  • Hector  · 技术社区  · 6 年前

    我正在调查 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());
    }
    
    0 回复  |  直到 6 年前