2017-11-03 15 views
1

私はクリーンなアーキテクチャのアンドロイドプロジェクトに取り組んでいます。 は、私は以下のクラスを持っている:このケースで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()メソッドがあります。

私の場合、観測値は、レルムフィットを使用してレルムフィットを使用してWebApiから取得することができます。

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

私は完全にアーキテクチャを理解:ビューからの後に呼び出され

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

は今プレゼンターのonDestroy()で、私のようなinteractor.disposeを()と呼ばれます管理されていないネットワークやデータベースリソースを処分することを理解していますが、RetrofitまたはRealmが接続を閉じてリソースを処分すると考えた場合、このケースでは観測可能なものを本当に問題にするかどうかを完全に理解する必要があります。

私はレルムを処分したり、リソースを改造するために関連していないが、私はドキュメントをチェックし、私が見つけたとして、観測それを自己に解除に関連するかもしれないと思う:

クラスDisposableObserver:できます抽象オブザーバー非同期キャンセル Disposableを実装しています。事前に実装されたすべての最終メソッドは、スレッドセーフで です。

公開ディスパッチ()メソッドを使用して、 のonNext実装内からシーケンスを破棄します。

しかし、私はまだそれを使用する利点を理解していません。ビューを破棄してonNext()からonComplete()に移動し、エミッタ上のサブスクリプションを閉じるために、オブザーブ可能なビューからの登録解除ですか?

答えて

1

システムがビュー(アクティビティまたはフラグメント)を開始した後にdisposeメソッドを使用する理由。サブスクリプションが開始された後、サブスクリプションがまだ実行されずに終了していない間に別のビューに戻るか、または別のビューを開始することに決めた場合、メモリにまだリークが発生することになります。だからあなたは、退会させるためにdisposeメソッドを呼び出さなければなりません。

関連する問題