Supponiamo che io ho il seguente codice RxJava (che accede a un DB, ma il caso esatto uso è irrilevante):Il thread di annullamento della sottoscrizione è sicuro in RxJava?
public Observable<List<DbPlaceDto>> getPlaceByStringId(final List<String> stringIds) {
return Observable.create(new Observable.OnSubscribe<List<DbPlaceDto>>() {
@Override
public void call(Subscriber<? super List<DbPlaceDto>> subscriber) {
try {
Cursor c = getPlacseDb(stringIds);
List<DbPlaceDto> dbPlaceDtoList = new ArrayList<>();
while (c.moveToNext()) {
dbPlaceDtoList.add(getDbPlaceDto(c));
}
c.close();
if (!subscriber.isUnsubscribed()) {
subscriber.onNext(dbPlaceDtoList);
subscriber.onCompleted();
}
} catch (Exception e) {
if (!subscriber.isUnsubscribed()) {
subscriber.onError(e);
}
}
}
});
}
Dato questo codice, ho le seguenti domande:
se qualcuno l'annullamento dell'iscrizione dall'osservabile restituito da questo metodo (dopo un precedente abbonamento), è tale operazione thread-safe? Quindi i miei controlli 'isUnsubscribed()' sono corretti in questo senso, indipendentemente dalla pianificazione?
Esiste un modo più pulito con un codice inferiore per verificare la presenza di stati non sottoscritti rispetto a quello che sto utilizzando qui? Non ho trovato nulla nel framework. Ho pensato che SafeSubscriber risolva il problema di non inoltrare eventi quando l'iscritto non è iscritto, ma a quanto pare non lo fa.
Grazie, hai effettivamente risposto ad un'altra mia domanda riguardante la creazione di osservabili 'personalizzati' con un adeguato supporto per la contropressione! Ho verificato SyncSubscriber e sembra davvero buono.In molti casi vedrei la conversione di un'operazione in un Iterable un po 'imbarazzante semanticamente, ma è comunque bene sapere che possiamo ottenere un semplice supporto per la retropressione in questo modo. Vedo, però, che questa classe è ancora contrassegnata come @Experimental, quando pensi che possa essere considerata approssimativamente la produzione? –
Buono a sapersi! Il passo successivo è quello di metterlo in una versione (che dovrebbe essere presto disponibile nella versione 1.0.15). Dopodiché, generalmente si promuoverà in stato '@ Beta' o direttamente in stato pubblico man mano che acquisiamo sicurezza. – Aaron