在使用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