何时调用dispose并清除CompositeDisposable

时间:2017-11-01 15:06:32

标签: android rx-java2

我的问题可能与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,实际上不会杀死Fragment但只会查看其视图。这意味着只调用onDestroyView而不是onDestroy。后来我可以回到Backstack中的同一个片段,所以只有它的视图才被重新创建。 我有CompositeDisposable作为我BaseFragment的成员,其中包含订阅。

我的问题是,我应该每次clear致电CompositeDisposable onDestroyView吗?一旦视图恢复,它可以再次获取订阅吗?并在dispose上调用onDestroy,这样当片段本身被销毁时,不再需要丢弃一次性用品了吗?

如果错了,处理的正确方法是什么。必须调用cleardispose时。?

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

代替使用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.

答案 2 :(得分:0)

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(); 
  • 清除-onStop()
  • 处置-onDestroy()

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

答案 3 :(得分:-1)

def tsplot2(y, title, lags=None, figsize=(12,8)): if not isinstance(y, pd.Series): y = pd.Series(y) fig= plt.figure(figsize=figsize) layout=(2,2) ts_ax=plt.subplot2grid(layout, (0,0)) hist_ax=plt.subplot2grid(layout, (0,1)) acf_ax=plt.subplot2grid(layout, (1,0)) pacf_ax=plt.subplot2grid(layout, (1,1)) y.plot(ax=ts_ax) ts_ax.set_title(title, fontsize=14, fontweight='bold') y.plot(ax=hist_ax, kind='hist', bins=25) hist_ax.set_title('Histogram') smt.graphics.plot_acf(y, lags=lags, ax=acf_ax) smt.graphics.plot_pacf(y, lags=lags, ax=pacf_ax) sns.despine() plt.tight_layout() return ts_ax, acf_ax, pacf_ax num_var= len(series.iloc[1,:]) for i in range(0, num_var): tsplot2(series.iloc[:,i].dropna() , title=series.columns[i], lags=48) 是一个好方法。您可以在clearCompositeDisposable之间共享一个Activity。这样,您的Fragments可以暂停清除,而不必管理每个Activity中的任务,并且Fragment开始将resume重新添加回subscriptions中。有几种共享方式。就我而言,我喜欢使用CompositeDisposable