2015-06-24 18 views
5

Chcę upewnić się, że nie powoduję żadnych wycieków pamięci podczas używania RxJava. Proszę dać mi znać, jeśli to właściwe sposoby obsługi każdy przypadek ...RxJava - Kiedy powinienem zajmować się rezygnacją z subskrypcji?

Przypadek 1

jeśli tworzę Observable i Subscription w tym samym zakresie, GC będzie dbać o pozbywając się ich? Czy muszę zadzwonić pod numer unsubscribe()?

public static void createObservableAndSubscribe() { 

     Observable<Integer> source = Observable.just(1,6,3,2,562,4,6); 

     Subscription sub = source.subscribe(i -> System.out.println(i)); 

     sub.unsubscribe(); //unnecessary I assume? GC should take care of it? 
} 

CASE 2

Ale co nieskończona obserwowalne i tymczasowy abonenta? Załóżmy, że mam GUI, który subskrybuje nieskończoną Observable. Ale kiedy GUI zostanie zniszczony, czy muszę jawnie zrezygnować z subskrypcji Subscriber?

public void attachSubscriber(Observable<Integer> infiniteObservable) { 
    Subscription sub = infiniteObservable.subscribe(i -> countLabel.setText(i.toString()); 

    //do stuff, have this subscription persist for the life of a GUI 
    sub.unsubscribe(); //must I do this when the GUI is destroyed? 
} 

Odpowiedz

5

Przypadek 1:

Źródło jest synchroniczny skończonych Obserwowalne więc strumień zakończy i rezygnacja sama (SafeSubscriber jest wprowadzany do sieci połączeń metodą subscribe i wywoła unsubscribe na zakończenie (błąd lub zakończenie)). Pamiętaj, że synchronizacja sub nie zostanie przypisana, dopóki strumień się nie zakończy!

Przypadek 2: polecam zrobić zapewnić unsubscribe pobiera nazywane w tym przypadku zaprzestania działalności i uwolnić swoje zasoby. Zauważ, że bardziej elastyczny wzór, który będzie pracować z obu źródeł synchronicznych i asynchronicznych jest skonfigurować Subscriber wcześniej i nie polegać na powrocie z metody subscribe:

Subscriber<Integer> subscriber = Subscribers.from(i-> {countLabel.setText(i.toString);}); 
infiniteObservable.subscribe(subscriber); 

Teraz jeśli zadzwonisz subscriber.unsubscribe() z wątku innego niż wątek, na którym subskrybowane jest obserwowalne, zatrzyma się, nawet jeśli obserwowalne było źródłem synchronicznym.

Powiązane problemy