Wie verwende ich CompositeDisposable von RxJava 2?


77

In RxJava 1 gab es CompositeSubscription, aber das ist in RxJava2 nicht vorhanden. In rxJava2 gibt es etwas CompositeDisposable. Wie verwende ich CompositeDisposable oder Disposable in RxJava2?

Antworten:


145
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(); 

Ich habe ein Beispielprojekt erstellt, um die Verwendung von RxJava2 zu demonstrieren. Hier finden Sie das Beispielprojekt - RxJava2-Android-Samples


7
Warum haben sie das Abonnement entfernt?
Anand Gaurav

3
@anandgaurav: Sie haben rxJava2 von Grund auf neu geschrieben, um bessere APIs zu erstellen.
Amit Shekhar

Sie können auch fromCallable anstelle von
defer

1
@anandgaurav Das Abonnement wird jetzt von den Streams verwendet und dient einem anderen Zweck. Das alte Abonnement ist jetzt verfügbar.
toshkinl

1
@ChayanChowdhury Überprüfen Sie dieses Projekt - github.com/MindorksOpenSource/android-mvp-architecture
Amit Shekhar

2

CompositeDisposablekann nach der Entsorgung nicht wiederverwendet werden. Wenn Sie den Einweg-Lebenszyklus mit dem Android-Aktivitätslebenszyklus synchronisieren möchten, können Sie dies durch Erstellen eines einfachen Wrappers tun.

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
    }
}

Wie benutzt man:

class MainActivity : AppCompatActivity() {
    private disposable = AndroidDisposable()

    override fun onStart() {
        super.onStart()
        disposable.add(/* Some disposable */)
    }

    override fun onStop() {
        disposable.dispose()
        super.onStop()
    }
}

-7
// clearing or unsubscibing
  disposables.clear(); 

diesen Ort nutzen dispose()


21
Dies ist kein guter Rat, da Sie eine beobachtbare Datei nach dispose () nicht erneut abonnieren können.
Box
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.