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

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM