何时调用dispose并清除CompositeDisposable

25 android rx-java2

我的问题可以是如何使用RxJava 2的CompositeDisposable的副本?但要求澄清一个疑问.根据接受的答案

// 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(); 
Run Code Online (Sandbox Code Playgroud)

在我的例子中,我使用片段作为我的视图(在MVP中查看图层),在某些情况下,我将活动片段添加到backstack,实际上不会杀死Fragment但只会查看其视图.这意味着只onDestroyView调用而不是调用onDestroy.后来我可以回到后台堆叠的同一个片段,所以只有它的视图才被重新创建.我有一个CompositeDisposable作为我的成员BaseFragment持有订阅.

我的问题是,我应该叫clearCompositeDisposable每个时间onDestroyView?一旦视图恢复,它可以再次获取订阅吗?并调用disposeonDestroy时候片段本身被破坏没有必要采取一次性用品了,所以呢?

如果错了,处理的正确方法是什么.当cleardispose具有被称为?

Jan*_*ans 10

你是对的,CompositeDisposable每次创建相应的视图时,你都可以避免创建一个新的,而是将一个CompositeDisposable实例视为与onCreate/onDestroy生命周期方法绑定的单个实例,并将聚合的一次性用作片段视图调用clear的一部分onDestroyView.


Fax*_*yev 8

Disposable.dispose()您可以更好地使用而不是使用 Composite ,CompositeDisposable.clear()这样您就不必创建新的 CompositeDisposable:方法文档

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

dispose() //Dispose the resource, the operation should be idempotent.
Run Code Online (Sandbox Code Playgroud)


Ami*_*har 5

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(); 
Run Code Online (Sandbox Code Playgroud)
  • 清除 - onStop()
  • 处置 - onDestroy()

我创建了一个示例项目来演示 RxJava2 的使用。在这里你可以找到示例项目 - RxJava2-Android-Samples