2017-11-03 331 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方法来取消订阅。

相关问题