zoukankan      html  css  js  c++  java
  • Android Jetpack之WorkManager: 观察结果

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

    LiveData<WorkInfo> liveOpStatus = WorkManager.getInstance(context)
            .getWorkInfoByIdLiveData(request.getId());
    得到一个WorkInfo的LiveData,然后观察它的任务的执行状态及返回结果。这里有一个问题,LiveData的observer需要两个参数,一个是LifecycleOwner,另一个是Observer<? super T> 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<WorkInfo> liveWorkStatus = new MediatorLiveData<>();

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

    liveWorkStatus.addSource(liveOpStatus, new Observer<WorkInfo>() {
                @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

    
    
  • 相关阅读:
    Linux 策略路由配置
    nmcli 使用记录---fatt
    wii 入门之路--fatt
    【转载】Eclipse智能提示及快捷键
    Sqlserver Sequence操作
    Git学习(二)(2015年11月18日)(2016年1月29日)
    Git学习(一)(2015年11月12日)
    【转载】.NET 开发者必备的工具箱
    SQLSERVER 游标
    sqlserver添加查询 表、字段注释(转)
  • 原文地址:https://www.cnblogs.com/gelandesprung/p/11497337.html
Copyright © 2011-2022 走看看