Ricerca…


Crea un osservabile

Esistono diversi modi per creare un Observable in RxJava. Il modo più efficace è utilizzare il metodo Observable.create . Ma è anche il modo più complicato . Quindi devi evitare di usarlo , per quanto possibile.

Emissione di un valore eccitante

Se hai già un valore, puoi utilizzare Observable.just per emettere il tuo valore.

 Observable.just("Hello World").subscribe(System.out::println);

Emissione di un valore che dovrebbe essere calcolato

Se si desidera emettere un valore che non è già calcolato, o che può richiedere molto tempo per essere calcolato, è possibile utilizzare Observable.fromCallable per emettere il valore successivo.

Observable.fromCallable(() -> longComputation()).subscribe(System.out::println);

longComputation() sarà chiamato solo quando ti iscrivi al tuo Observable . In questo modo, il calcolo sarà pigro .

Modo alternativo per emettere un valore che dovrebbe essere calcolato

Observable.defer costruisce un Observable come Observable.fromCallable ma viene utilizzato quando è necessario restituire un Observable anziché un valore. È utile quando vuoi gestire gli errori nella tua chiamata.

Observable.defer(() -> {
          try {
                return Observable.just(longComputation());
          } catch(SpecificException e) {
                return Observable.error(e);
          }).subscribe(System.out::println);

Osservabili caldi e freddi

Gli osservabili sono generalmente classificati come Hot o Cold , a seconda del loro comportamento di emissione.
Un Cold Observable è uno che inizia a emettere su richiesta (abbonamento), mentre un Hot Observable è uno che emette indipendentemente dalle sottoscrizioni.

Osservabile a freddo

/* Demonstration of a Cold Observable */
Observable<Long> cold = Observable.interval(500, TimeUnit.MILLISECONDS); // emits a long every 500 milli seconds
cold.subscribe(l -> System.out.println("sub1, " + l)); // subscriber1
Thread.sleep(1000); // interval between the two subscribes
cold.subscribe(l -> System.out.println("sub2, " + l)); // subscriber2

L'output del codice sopra sembra (può variare):

sub1, 0    -> subscriber1 starts
sub1, 1
sub1, 2
sub2, 0    -> subscriber2 starts
sub1, 3
sub2, 1
sub1, 4
sub2, 2

Si noti che anche se sub2 inizia tardi, riceve valori dall'inizio. Per concludere, un Cold Observable emette solo gli articoli quando richiesto. Più richiesta avvia più pipeline.

Osservabile caldo

Nota: le osservabili Hot emettono valori indipendenti dalle singole sottoscrizioni. Hanno la loro sequenza temporale e gli eventi si verificano se qualcuno sta ascoltando o meno.

Un Cold Observale può essere convertito in Hot Observable con una semplice publish .

Observable.interval(500, TimeUnit.MILLISECONDS)
    .publish(); // publish converts cold to hot

publish restituisce un ConnectableObservable che aggiunge funzionalità per connettersi e disconnettersi dall'osservabile.

ConnectableObservable<Long> hot = Observable
                                    .interval(500, TimeUnit.MILLISECONDS)
                                    .publish(); // returns ConnectableObservable
hot.connect(); // connect to subscribe

hot.subscribe(l -> System.out.println("sub1, " + l));
Thread.sleep(1000);
hot.subscribe(l -> System.out.println("sub2, " + l));

I suddetti rendimenti:

sub1, 0  -> subscriber1 starts
sub1, 1
sub1, 2
sub2, 2  -> subscriber2 starts
sub1, 3
sub2, 3

Notare che anche se sub2 inizia a osservare in ritardo, è sincronizzato con sub1 .
La disconnessione è un po 'più complicata! La disconnessione avviene Subscription e non Observable .

ConnectableObservable<Long> hot = Observable
                                    .interval(500, TimeUnit.MILLISECONDS)
                                    .publish(); // same as above
Subscription subscription = hot.connect(); // connect returns a subscription object, which we store for further use

hot.subscribe(l -> System.out.println("sub1, " + l));
Thread.sleep(1000);
hot.subscribe(l -> System.out.println("sub2, " + l));
Thread.sleep(1000);
subscription.unsubscribe(); // disconnect, or unsubscribe from subscription

System.out.println("reconnecting");
/* reconnect and redo */
subscription = hot.connect();
hot.subscribe(l -> System.out.println("sub1, " + l));
Thread.sleep(1000);
hot.subscribe(l -> System.out.println("sub2, " + l));
Thread.sleep(1000);
subscription.unsubscribe();

Quanto sopra produce:

sub1, 0   -> subscriber1 starts
sub1, 1
sub1, 2
sub2, 2   -> subscriber2 starts
sub1, 3
sub2, 3
reconnecting  -> reconnect after unsubscribe
sub1, 0
...

Dopo la disconnessione, l' Observable essenzialmente "termina" e si riavvia quando viene aggiunto un nuovo abbonamento.

Hot Observable può essere usato per creare un EventBus . Tali Eventbus sono generalmente leggeri e super veloci. L'unico lato negativo di un RxBus è che tutti gli eventi devono essere implementati manualmente e passati al bus.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow