2014-09-02 23 views
40

Sto usando un RxJava ReplaySubject nel mio frammento.Se viene effettuata la chiamata onComplete per un oggetto RxJava, devo annullare l'iscrizione manualmente di nuovo?

Sto tentando di utilizzare ReplaySubject in un modo, in cui desidero che il soggetto esegua un processo fino al completamento (probabilmente oltre la durata del frammento).

Al completamento del processo, vorrei rilasciare le risorse che, come ho capito, vengono cancellate dall'abbonamento al momento della registrazione dell'osservatore (che nel mio caso è il soggetto stesso).

In questo github issue thread @benjchristensen dice:

Se si tratta di un 'osservabile allora dovrebbe emettere un onCompleted e farla finita.

Se si tratta di un osservatore, è necessario annullare l'iscrizione dall'abbonamento ricevuto quando è chiamato Observable.subscribe e darà all'osservabile la possibilità di spegnersi e ripulirsi.

Se si tratta di un oggetto, che è sia un osservatore che un osservabile, qual è il comportamento? Se io chiamo Completo sull'argomento, significa che la sottoscrizione è stata interrotta, e quindi sono sollevato dal dover annullare manualmente l'iscrizione che ottengo registrando l'osservatore?

risposta

56

I soggetti sono uno strato relativamente sottile sopra un Osservabile che consente di alimentare le chiamate onNext(), onCompleted() e onError() da una fonte esterna a Observable. Il loro comportamento di disiscrizione è lo stesso di un Osservabile. Se onCompleted() o onError() vengono richiamati nell'oggetto, gli abbonati verranno annullati. Non è necessario chiamare unsubscribe() per l'abbonamento restituito da Observable.subscribe().

Per un ReplaySubject, si noti che le risorse non verranno ripulite fino a quando non vengono raccolte informazioni inutili. Anche dopo che ReplaySubject è stato chiamato su , un sottoscrittore può ancora iscriversi e riceverà tutte le chiamate originali onNext(), onCompleted() o onError() precedenti alla sottoscrizione.

+0

buon punto su ReplaySubject. –

+0

Questo vale anche per .cache e .replay trasformabili osservabili? – Zardoz

+1

Questo è menzionato nella documentazione da qualche parte? Ho passato letteralmente un'ora su questo oggi prima di aver trovato questo thread. –

Problemi correlati