【问题标题】:How to use CompositeDisposable of RxJava 2?如何使用 RxJava 2 的 CompositeDisposable?
【发布时间】:2017-01-05 08:09:02
【问题描述】:

在 RxJava 1 中,有 CompositeSubscription,但在 RxJava2 中不存在,在 rxJava2 中有 CompositeDisposable。如何在 RxJava2 中使用 CompositeDisposable 或 Disposable?

【问题讨论】:

    标签: java android rx-java rx-java2 rx-android


    【解决方案1】:
    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(); 
    

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

    【讨论】:

    • 他们为什么取消订阅?
    • @anandgaurav :他们从头开始编写 rxJava2,因此他们创建了更好的 api。
    • @anandgaurav 订阅现在由流使用并用于其他目的。旧订阅现在是一次性的。
    • @ChayanChowdhury 检查这个项目 - github.com/MindorksOpenSource/android-mvp-architecture
    • @AmitShekhar 关于.clear().dispose() 之间的区别非常棒!我不知道使用 dispose() will not accept any new disposable
    【解决方案2】:

    CompositeDisposable 处理后不能再使用。如果你想将一次性生命周期与 Android Activity 生命周期同步,可以通过做一个简单的包装器来对应。

    class AndroidDisposable {
        private var compositeDisposable: CompositeDisposable? = null
    
        fun add(disposable: Disposable) {
            if (compositeDisposable == null) {
                compositeDisposable = CompositeDisposable()
            }
            compositeDisposable?.add(disposable)
        }
    
        fun dispose() {
            compositeDisposable?.dispose()
            compositeDisposable = null
        }
    }
    

    使用方法:

    class MainActivity : AppCompatActivity() {
        private disposable = AndroidDisposable()
    
        override fun onStart() {
            super.onStart()
            disposable.add(/* Some disposable */)
        }
    
        override fun onStop() {
            disposable.dispose()
            super.onStop()
        }
    }
    

    【讨论】:

      【解决方案3】:
      // clearing or unsubscibing
        disposables.clear(); 
      

      这个地方使用dispose()

      【讨论】:

      • 这不是一个好建议,因为您无法在 dispose() 之后重新订阅 observable。
      猜你喜欢
      • 2018-03-21
      • 2018-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多