Angenommen, ich habe folgenden RxJava Code (die eine DB zugreift, aber der genaue Anwendungsfall ist irrelevant):Ist Thread in RxJava sicher abgemeldet?
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);
}
}
}
});
}
dieser Code erhalten, habe ich folgende Fragen:
Wenn jemand Melden Sie sich von der Observable ab, die von dieser Methode zurückgegeben wurde (nach einer vorherigen Subskription), ist diese Operation Thread-sicher? Also sind meine 'isUnsubscribed()' Checks in diesem Sinne korrekt, unabhängig von der Planung?
Gibt es einen saubereren Weg mit weniger Code, um auf Abmeldestatus zu prüfen, als ich hier verwende? Ich konnte im Rahmen nichts finden. Ich dachte, SafeSubscriber löst das Problem, keine Ereignisse weiterzuleiten, wenn der Abonnent abgemeldet ist, aber anscheinend nicht.
Danke, Sie haben tatsächlich eine andere Frage von mir bezüglich der Erstellung von "benutzerdefinierten" Observablen mit angemessener Gegendruckunterstützung beantwortet! Ich habe SyncSubscriber ausgecheckt und es sieht wirklich gut aus.In vielen Fällen würde ich eine semantische Umwandlung einer Operation in ein Iterable ein bisschen peinlich sehen, aber es ist immer noch gut zu wissen, dass wir auf diese Weise eine einfache Gegendruck-Unterstützung bekommen können. Ich sehe aber, dass diese Klasse immer noch als @Experimental markiert ist, wann denkst du, dass es grob gesagt produktionsbereit sein kann? –
Gut zu hören! Der nächste Schritt ist, es in eine Veröffentlichung zu bringen (die bald in Version 1.0.15 erscheinen sollte). Danach wird es im Allgemeinen in den Status "@ Beta" oder direkt in den öffentlichen Status befördert, wenn wir Vertrauen gewinnen. – Aaron