Sto provando a scrivere un semplice programma utilizzando RxJava per generare una sequenza infinita di numeri naturali. Quindi, ho trovato due modi per generare una sequenza di numeri usando Observable.timer() e Observable.interval(). Non sono sicuro che queste funzioni siano il modo giusto per affrontare questo problema. Mi aspettavo una semplice funzione come quella che abbiamo in Java 8 per generare numeri naturali infiniti.Genera sequenza infinita di numeri naturali usando RxJava
IntStream.iterate (1, valore -> valore +1) .forEach (System.out :: println);
Ho provato a utilizzare IntStream con Observable ma non funziona correttamente. Invia un flusso infinito di numeri solo al primo sottoscrittore. Come posso generare correttamente una sequenza infinita di numeri naturali?
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);
}
}
Grazie Mike per la risposta. Sarebbe diverso se io chiamo il metodo subscribeOn mentre creo Observable invece di chiamarlo tre volte come mostrato nello snippet di codice sopra. L'ho provato e il comportamento è lo stesso, ma voglio ancora confermarlo. – Shekhar
Questo problema è stato identificato correttamente, ma questo è un cattivo consiglio: non dovresti mai usare "subscribeOn" per risolvere questo problema - vedi la mia risposta sul perché. –
Chiamando 'unsubscribe' in questo modo disconnette l'utente, quindi smette di ricevere messaggi, ma non interrompe il ciclo del generatore, che continua a funzionare in modo infinito consumando la potenza della CPU. Vedi la mia risposta su come affrontare entrambi i lati della storia. –