gpt4 book ai didi

android - 为什么在这种情况下处理 DisposableObserver 很重要

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:40:32 25 4
gpt4 key购买 nike

我正在开发具有整洁架构的 android 项目。

我有以下类(class):

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);
}
}

所以 execute(..) 获取一个 DisposableObserver,然后调用一个 dispose() 方法来处理这个 observable。

在我的例子中,observable 可能来自使用改造的 WebApi 或使用 Realm 的缓存。

现在在演示器 onDestroy() 中,我调用了 interactor.dispose(),例如:

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

在 View 之后调用:

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

我完全理解架构,也理解处理非托管网络或数据库资源,但我需要完全理解在这种情况下,observable 的处理是否真的很重要,因为我认为 Retrofit 或 Realm 自动管理关闭连接和处理有资源。

我认为它与处置领域或改造资源无关,但它可能与取消订阅可观察对象有关,因为我检查了文档并发现:

Class DisposableObserver: An abstract Observer that allows asynchronous cancellation by implementing Disposable. All pre-implemented final methods are thread-safe.

Use the public dispose() method to dispose the sequence from within an onNext implementation.

但我仍然不明白使用它的好处。是否在销毁 View 时取消订阅可观察对象,以便它从 onNext() 转到 onComplete() 并关闭对发射器的订阅?

最佳答案

使用 dispose 方法的原因是因为在系统启动 View (activityfragment)后,订阅开始,然后您决定返回或在旧订阅仍在执行且未完成其工作时启动另一个 View 。这意味着它仍在内存中,这将导致 内存泄漏。所以你必须调用 dispose 方法来取消订阅。

关于android - 为什么在这种情况下处理 DisposableObserver 很重要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47104956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com