Я работаю над проектом Android с чистой архитектурой.
У меня есть класс ниже:
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()
метод, который вызывается для удаления этого наблюдаемого.
В моем случае наблюдаемое может поступать из WebApi с использованием модернизации или кеширования с использованием Realm.
Теперь в презентаторе onDestroy () я вызвал interactor.dispose()
, например:
@Override public void destroy() {
super.destroy();
myInteractor.dispose();
}
который вызывается после этого из представления:
@Override public void onDestroy() {
super.onDestroy();
if (getPresenter() != null) {
getPresenter().destroy();
}
}
Я полностью понимаю архитектуру, а также понимаю удаление неуправляемых ресурсов сети или базы данных, но мне нужно полностью понимать, действительно ли в этом случае удаление наблюдаемых имеет значение, поскольку я думал, что Retrofit или Realm автоматически управляют закрытием соединений и удалением их ресурсов.
Я думаю, что это не связано с удалением области или модернизацией ресурсов, но это может быть связано с отказом от подписки на наблюдаемое само, когда я проверил документацию и обнаружил:
Класс DisposableObserver: абстрактный наблюдатель, который позволяет асинхронную отмену путем реализации Disposable. Все предварительно реализованные методы final являются потокобезопасными.
Используйте метод public dispose (), чтобы удалить последовательность из реализации onNext.
Но я все еще не понимаю преимуществ его использования. Это для отказа от подписки на наблюдаемое при уничтожении представления, чтобы оно перешло с onNext()
на onComplete()
и закрыло подписку на эмиттере?