android 何时对CompositeDisposable调用dispose和清除

mrzz3bfm  于 2022-11-03  发布在  Android
关注(0)|答案(4)|浏览(434)

我的问题可以是How to use CompositeDisposable of RxJava 2?的重复,但要求澄清一个疑问。根据公认的答案

// Using clear will clear all, but can accept new disposable
disposables.clear(); 
// Using dispose will clear all and set isDisposed = true, so it will not accept any new disposable
disposables.dispose();

在我的例子中,我使用片段作为我的视图(MVP中的视图层),在某些场景中,我将活动片段添加到backstack,这实际上并不删除片段,而只是删除其视图。这意味着只调用onDestroyView,而不是onDestroy。稍后,我可以返回backstack中的同一个片段,因此只重新创建了它的视图。我有一个CompositeDisposable作为我的BaseFragment的成员,它持有订阅。
我的问题是,我应该在onDestroyView上每次都在CompositeDisposable上调用clear吗?这样一旦视图恢复,它就可以再次接受订阅了吗?并且在onDestroy上调用dispose,这样当片段本身被破坏时,就不需要再接受一次性的东西了吗?
如果是错误的,正确的处理方法是什么?当必须调用cleardispose时。

hs1ihplo

hs1ihplo1#

您是对的,您可以保存在每次创建相应的视图时都创建新的CompositeDisposable,而是将CompositeDisposable视为绑定到onCreate/onDestroy生命周期方法的单个示例,并将聚合的一次性对象视为片段视图的一部分,在onDestroyView中调用clear

0lvr5msh

0lvr5msh2#

最好不要使用Composite Disposable.dispose(),而是使用CompositeDisposable.clear(),这样就不必创建新的CompositeDisposable:method documentation

clear() //Atomically clears the container, then disposes all the previously contained Disposables.

dispose() //Dispose the resource, the operation should be idempotent.
euoag5mw

euoag5mw3#

private final CompositeDisposable disposables = new CompositeDisposable();

// adding an Observable to the disposable
disposables.add(sampleObservable()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(new DisposableObserver<String>() {
                    @Override
                    public void onComplete() {
                    }

                    @Override
                    public void onError(Throwable e) {
                    }

                    @Override
                    public void onNext(String value) {
                    }
                }));

    static Observable<String> sampleObservable() {
        return Observable.defer(new Callable<ObservableSource<? extends String>>() {
            @Override
            public ObservableSource<? extends String> call() throws Exception {
                // Do some long running operation
                SystemClock.sleep(2000);
                return Observable.just("one", "two", "three", "four", "five");
            }
        });
    }                

// Using clear will clear all, but can accept new disposable
disposables.clear(); 
// Using dispose will clear all and set isDisposed = true, so it will not accept any new disposable
disposables.dispose();
  • 清除-on停止()
  • 处置-销毁时()

我已经创建了一个示例项目来演示RxJava 2的使用。

x6h2sr28

x6h2sr284#

我遇到了同样的问题。我用下面的方法BaseAbstractPresenter修复了它:

protected lateinit var compositeDisposable : CompositeDisposable

@CallSuper
override fun attachView(view: BaseView) {
    compositeDisposable = CompositeDisposable()
}

@CallSuper
override fun detachView() {
    if(this::compositeDisposable.isInitialized)
        compositeDisposable.dispose()
}

相关问题