2017-11-03 150 views
1

我使用乾淨的架構來處理android項目。 我有以下類:爲什麼配置DisposableObserver在這種情況下很重要

public abstract class RxBaseInteractor<T, Params> { 

    private final CompositeDisposable disposables; 

    public RxBaseInteractor() { 
    this.disposables = new CompositeDisposable(); 
    } 

    abstract public Observable<T> buildUseCaseObservable(Params params); 

    public void execute(DisposableObserver<T> observer, Params params) { 
    Preconditions.checkNotNull(observer); 
    final Observable<T> observable = this.buildUseCaseObservable(params) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()); 
    addDisposable(observable.subscribeWith(observer)); 
    } 

    public void dispose() { 
    if (!disposables.isDisposed()) { 
     disposables.dispose(); 
    } 
    } 

    protected void addDisposable(Disposable disposable) { 
    Preconditions.checkNotNull(disposable); 
    Preconditions.checkNotNull(disposables); 
    disposables.add(disposable); 
    } 
} 

所以執行(..)採取DisposableObserver再有就是被稱爲處理此而觀察到的Dispose()方法。

對我而言,observable可能來自WebApi,使用Realm進行改造或緩存。

現在在演示者的onDestroy()中,i稱爲interactor.dispose()之類:

@Override public void destroy() { 
     super.destroy(); 
     myInteractor.dispose(); 
    } 

其之後,從該視圖稱爲:

@Override public void onDestroy() { 
    super.onDestroy(); 
    if (getPresenter() != null) { 
     getPresenter().destroy(); 
    } 
    } 

我充分理解體系結構同時我也理解處理未管理的網絡或數據庫資源,但我需要完全理解,在這種情況下,處置observable真的很重要,因爲我認爲Retrofit或Realm會自動管理關閉連接並處理資源。

我認爲這是不相關的處置領域或改造的資源,但它可以退訂可觀測它的自我,因爲我查了資料有關係,我發現:

類DisposableObserver:一個抽象的觀察員,允許異步取消通過 執行一次性。所有預執行的最終方法是線程安全的 。

使用public dispose()方法處理下一個實現中的 內的序列。

但我仍然不明白使用它的好處。是否在銷燬視圖時取消訂閱observable,以便從onNext()到onComplete()並關閉發射器上的訂閱?

回答

1

因爲在系統啓動視圖(活動或片段)後使用dispose方法的原因。訂閱開始,然後你決定返回或啓動另一個視圖,而訂閱仍然執行,並沒有完成它的工作,這意味着它仍然在內存中,會導致內存泄漏。所以你必須調用dispose方法來取消訂閱。

相關問題