2016-06-12 12 views
9

W mojej bazie kodów istnieje kilka sytuacji, w których strumień, do którego subskrybuję, wyemituje tylko jeden wynik i jako taki ma sens użycie rx.Single zamiast rx.Observable. documentation do Pojedynczego mówi co następuje:Rezygnacja z subskrypcji rx.Single w RxJava

A Single zadzwoni tylko jednej z tych metod, a zadzwoni tylko to raz. Po wywołaniu którejkolwiek metody, Single kończy się, a subskrypcja się kończy.

Z tradycyjnym Observable przechwycić odniesienie do subskrypcji tak, że mogę wypisać się w odpowiednim czasie i nie powodować wycieki pamięci:

Subscription s = getObservable().subscribe(...); 
subscriptions.add(s); 
subscriptions.clear(); 

Moje pytanie brzmi, czy jest to konieczne z jednego lub czy ze względu na fakt, że subskrypcja wygasa natychmiast mogło być pozostawione po prostu jako:

getSingle.subscribe(...); 

Bez żadnych negatywnych reperkusji odniesień przetrzymywanych na Into the subskrybent.

+1

ah - aby wyjaśnić, że to nie jest lista, jest to CompositeSubscription – Jahnold

Odpowiedz

8

Single nie mówi nic o jak długo zostanie on uruchomiony.

Ponieważ kierujesz reklamy na Androida, odpowiedzią jest tak, powinieneś zachować subskrypcję i zrezygnować z subskrypcji.

Wyobraź sobie, że przełączasz fragmenty/działania i długo działa SingleSubscribers'sonSuccess jest wywoływana. Najlepszym czasem i przestrzenią jest prawdopodobnie onPause(), ale zależy to od kontekstu.

Możesz napotkać NullPinterExceptions, Adaptery są wypełniane wielokrotnie lub podobne problemy, jeśli nie zrezygnujesz z subskrypcji.

1

Każdy powód, dla którego chcesz oczyścić subskrypcję w Obserwowalny ?. Obserwowalne przez projekt, gdy obserwator ma wszystkie przedmioty, jest automatycznie anulowane.

A następnie, ponieważ instancja nie jest już odniesieniem, GC w pewnym momencie oczyści dla ciebie.

Możesz zobaczyć w tym przykładzie sposób, w jaki subskrypcja jest wypisywana po osiągnięciu funkcji onComplete.

https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/creating/ObservableSubscription.java

Powiązane problemy