Próbuję napisać prosty program przy użyciu RxJava do generowania nieskończonej sekwencji liczb naturalnych. Tak dalece znalazłem dwa sposoby generowania sekwencji liczb przy użyciu Observable.timer() i Observable.interval(). Nie jestem pewien, czy te funkcje są właściwym sposobem podejścia do tego problemu. Spodziewałem się prostej funkcji takiej, jaką mamy w Javie 8, aby generować nieskończone liczby naturalne.Generowanie nieskończonej sekwencji liczb naturalnych za pomocą RxJava
IntStream.iterate (1, wartość -> wartość +1) .forEach (System.out :: println);
Próbowałem używać IntStream with Observable, ale to nie działa poprawnie. Wysyła nieskończony strumień liczb tylko do pierwszego abonenta. Jak poprawnie wygenerować nieskończoną liczbę naturalną?
import rx.Observable;
import rx.functions.Action1;
import java.util.stream.IntStream;
public class NaturalNumbers {
public static void main(String[] args) {
Observable<Integer> naturalNumbers = Observable.<Integer>create(subscriber -> {
IntStream stream = IntStream.iterate(1, val -> val + 1);
stream.forEach(naturalNumber -> subscriber.onNext(naturalNumber));
});
Action1<Integer> first = naturalNumber -> System.out.println("First got " + naturalNumber);
Action1<Integer> second = naturalNumber -> System.out.println("Second got " + naturalNumber);
Action1<Integer> third = naturalNumber -> System.out.println("Third got " + naturalNumber);
naturalNumbers.subscribe(first);
naturalNumbers.subscribe(second);
naturalNumbers.subscribe(third);
}
}
Dzięki Mike za odpowiedź. Czy byłoby inaczej, gdybym wywołał metodę subscribeOn podczas tworzenia Observable zamiast wywoływania go trzy razy, jak pokazano w powyższym fragmencie kodu. Testowałem to i zachowanie jest takie samo, ale wciąż chcę je potwierdzić. – Shekhar
Ten problem został poprawnie zidentyfikowany, ale jest to zła rada - nigdy nie powinieneś używać 'subscribeOn' do rozwiązania tego problemu - zobacz moją odpowiedź na pytanie dlaczego. –
W ten sposób wywołanie 'unsubscribe' powoduje rozłączenie subskrybenta, więc przestaje odbierać wiadomości, ale nie zatrzymuje pętli generatora, która nieprzerwanie pobiera energię procesora. Zobacz moją odpowiedź na pytanie, jak rozwiązać obie strony historii. –