Android Jetpack之WorkManager: 观察结果
阅读原文时间:2023年07月09日阅读:1

在使用WorkManager的时候,有时候需要关注任务执行的结果和状态,可以使用

LiveData liveOpStatus = WorkManager.getInstance(context)
.getWorkInfoByIdLiveData(request.getId());

得到一个WorkInfo的LiveData,然后观察它的任务的执行状态及返回结果。这里有一个问题,LiveData的observer需要两个参数,一个是LifecycleOwner,另一个是Observer observer。observer是处理任务状态的函数,这个好办。
LifecycleOwner就比较麻烦一点,除非我们是在Activity或者Fragment中,否则就没有LifecycleOwner,比如在一个单例中,我想到两个办法:
一个是使用全局的生命周期,

ProcessLifecycleOwner.get()

这个需要引用一个库

implementation 'androidx.lifecycle:lifecycle-process:2.2.0-alpha04'

或者是自己构造一个LifecycleOwner,这个想法比较奇葩,但是我试过可以用

new LifecycleOwner(){
@NonNull
@Override
public Lifecycle getLifecycle() {
return new Lifecycle() {
@Override
public void addObserver(@NonNull LifecycleObserver observer) {

                }

                @Override  
                public void removeObserver(@NonNull LifecycleObserver observer) {

                }

                @NonNull  
                @Override  
                public State getCurrentState() {  
                    return State.CREATED;  
                }  
            };  
        }  
    };

用法写完了,但是我用的时候总感觉哪地方不太对,因为我觉得observer用完之后 没有removeObserver,心里总觉得不太爽,于是我找到了另一个用法,比如在单例模式下,定义一个全局的MediatorLiveData

final MediatorLiveData liveWorkStatus = new MediatorLiveData<>();

每次执行任务的时候把它的观察对象liveOpStatus放到liveWorkStatus中

liveWorkStatus.addSource(liveOpStatus, new Observer() {
@Override
public void onChanged(WorkInfo workInfo) {
liveWorkStatus.setValue(workInfo);
WorkInfo.State state = workInfo.getState();
if (state.isFinished()) {
liveWorkStatus.removeSource(liveOpStatus);
}
}
});

每次执行完任务就把这个LiveData从全局的观察对对象中删除掉。而单例对象是和进程同生共死的,所以可以用全局的LifecycleOwner,也就是ProcessLifecycleOwner。

还有一个比较有意思的东西,回头再写出来。

参考https://www.codota.com/web/assistant/code/rs/5c7c468fac38dc0001e26004#L30

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章