web-dev-qa-db-fra.com

Quand appeler disposer et effacer sur CompositeDisposable

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.?

16
user4260260

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.

7
Jans
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(); 
  • Effacer - onStop ()
  • Éliminer - onDestroy ()

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

0
Amit Shekhar