Załóżmy, że mam następujący kod RxJava (który uzyskuje dostęp do DB, ale dokładny przypadek użycia nie ma znaczenia):Czy anulowanie subskrypcji jest bezpieczne w aplikacji 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);
}
}
}
});
}
Biorąc pod uwagę ten kod, mam następujące pytania:
jeśli ktoś anulowanie subskrypcji z obserwowalnej zwróconej z tej metody (po poprzedniej subskrypcji), czy ta operacja jest bezpieczna dla wątków? Czy moje kontrole "isUnsubscribed()" są poprawne w tym sensie, niezależnie od harmonogramu?
Czy jest jakiś bardziej przejrzysty sposób z mniejszą liczbą znaków, aby sprawdzić stan wypowiedzenia niż to, czego używam tutaj? Nie mogłem znaleźć niczego w ramach. Myślałem, że SafeSubscriber rozwiązuje problem nieprzesyłania zdarzeń, gdy subskrybent jest zrezygnowany, ale najwyraźniej tak nie jest.
Dzięki, faktycznie odpowiedziałeś na inne moje pytanie dotyczące tworzenia "niestandardowych" obserwowalnych z odpowiednim wsparciem przeciwciśnienia! Sprawdziłem SyncSubscriber i wygląda naprawdę dobrze.W wielu przypadkach przekonwertowałbym operację na Iterable nieco niezręcznie semantycznie, ale wciąż dobrze jest wiedzieć, że możemy w ten sposób uzyskać proste wsparcie przeciwprężne. Widzę jednak, że ta klasa jest nadal oznaczona jako @Experimental, kiedy myślisz, że można ją z grubsza uznać za gotową do produkcji? –
Dobrze słyszeć! Następnym krokiem jest wprowadzenie go do wydania (które powinno wkrótce nastąpić w wersji 1.0.15). Potem zwykle promuje się do statusu @ Beta lub bezpośrednio do statusu publicznego, gdy zyskujemy zaufanie. – Aaron