Ma question peut être un doublon de Comment utiliser CompositeDisposable de RxJava 2? Mais demander de lever un doute de plus. Selon la réponse acceptée
// 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();
Dans mon cas, j'utilise des fragments comme vues (couche View dans MVP) et dans certains scénarios, j'ajoute un fragment actif à backstack, ce qui ne tue pas réellement le fragment mais seulement sa vue. Ce qui signifie que seul onDestroyView
est appelé et non le onDestroy
. Et plus tard, je peux revenir sur le même fragment qui est dans le backstack, donc seule sa vue est recréée. J'ai un CompositeDisposable
en tant que membre de mon BaseFragment
qui détient des abonnements.
Ma question est, dois-je appeler clear
sur CompositeDisposable
à chaque fois sur onDestroyView
? Pour qu'il puisse à nouveau prendre des abonnements une fois la vue reprise? Et appelez dispose
sur le onDestroy
, de sorte que lorsque le fragment lui-même est détruit, plus besoin de prendre des articles jetables?
Si c'est faux, quelle est la bonne façon de gérer. Quand clear
et dispose
doivent être appelés.?
Vous avez raison, vous pouvez vous empêcher de créer un nouveau CompositeDisposable
pour chaque fois que la vue correspondante est créée, mais à la place, traiter un CompositeDisposable
comme une seule instance liée au onCreate/onDestroy
les méthodes de cycle de vie et traitent les produits jetables agrégés comme faisant partie de la vue de fragment appelant clear
dans onDestroyView
.
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();
J'ai créé un exemple de projet pour démontrer l'utilisation de RxJava2. Ici vous pouvez trouver le exemple de projet - RxJava2-Android-Samples