Suggerimento: Fuoco e dimenticare
Non state dimenticando se si mantiene un abbonamento intorno. Basta chiamare iscriviti e andare avanti.
service.doSomething()
.timeout(10, TimeUnit.SECONDS)
.subscribe(() -> {
otherService.doAction()
}
Edit: garbage collection.
A meno che non si faccia qualcosa di molto strano (ad esempio utilizzando WeakReference), il codice di esecuzione in doSomething
impedirà l'intera raccolta della garbage collection.
Pensa a RxJava come una cipolla, ogni volta che trasformi un osservabile (mappa, doOnNext, ecc.) Viene creato un nuovo Osservabile che avvolge il vecchio osservabile come una cipolla.
Per ogni trasformazione viene creato un nuovo Subscriber
che passa i callback (onNext, onCompleted, onError) al successivo Subscriber
nella catena.
Il motivo principale per un Subscription
è così che è possibile chiamare unsubscribe
. Ci sono due motivi per cui potresti voler annullare l'iscrizione.
Hai un osservabile caldo. Fondamentalmente questo osservabile emetterà valori per sempre. Un esempio potrebbe essere un osservabile che emette il tempo ogni 30 secondi. Puoi chiamare unsubscribe
quando non sei più interessato al valore del tempo.
Si desidera annullare un'operazione lunga. Diciamo che stai caricando una pagina web da visualizzare all'utente, se l'utente preme indietro, vuoi annullare il caricamento (non ti interessa più dei risultati).
Esempio codice sorgente per il funzionamento mappa
Mappa semplicemente chiamate lift
con una OperatorMap
come argomento. Lift crea un nuovo Observable
basato su un Operator
, può essere ignorato per il momento.
public final <R> Observable<R> map(Func1<? super T, ? extends R> func) {
return lift(new OperatorMap<T, R>(func));
}
OperatorMap
crea un nuovo Subscriber
che passa per lo più solo chiamate in qualunque Subscriber
è dato.Questo potrebbe essere il Subscriber
si passa in subscribe
o un Subscriber
creato da un'altra trasformazione map
, non importa.
public final class OperatorMap<T, R> implements Operator<R, T> {
private final Func1<? super T, ? extends R> transformer;
public OperatorMap(Func1<? super T, ? extends R> transformer) {
this.transformer = transformer;
}
@Override
public Subscriber<? super T> call(final Subscriber<? super R> o) {
return new Subscriber<T>(o) {
@Override
public void onCompleted() {
o.onCompleted();
}
@Override
public void onError(Throwable e) {
o.onError(e);
}
@Override
public void onNext(T t) {
try {
o.onNext(transformer.call(t));
} catch (Throwable e) {
Exceptions.throwOrReport(e, this, t);
}
}
};
}
}
Oh ... Sembra facile, ma sono confuso. Cosa impedisce all'intera catena di oggetti di raccogliere i rifiuti? – Buttink
In breve, il codice di esecuzione in 'doSomething' vede la mia risposta aggiornata per maggiori dettagli. – cyroxis
Ciò che impedisce all'intera catena di oggetti di ottenere la garbage collection è il 'Subscription' che si sta tenendo. (come ha detto Cyroxis: "Non ti stai dimenticando di tenere un abbonamento in giro.") Senza il 'Subscription', i dati diventano irraggiungibili (non è collegato ad altri dati) e vengono raccolti. –