das Basisobjekt in Rx ist Observable
. Dieses Objekt umschließt normalerweise ein OnSubscribe
Objekt, das einfach eine Erweiterung von Action1
ist, die einen Subscriber
als Parameter verwendet.
Was alles, was bedeutet, dass Sie brauchen nur eine Klasse zu definieren, die Ihren Anruf wickelt und übergibt das Ergebnis an den Subscriber
:
public class RxPaperGet implements Observable.OnSubscribe<String> {
@Override
public void call(Subscriber<? super String> t1) {
try {
t1.onNext(Paper.get("city"));
} catch (Throwable t) {
t1.onError(t);
return;
}
t1.onCompleted();
}
}
Das ist ein einfaches Beispiel ist. Jetzt möchten Sie das umhüllen, so dass Sie jede Funktion aufrufen können, und nicht nur Paper.get("city")
. Etwas wie https://github.com/ReactiveX/RxJavaAsyncUtil/blob/0.x/src/main/java/rx/util/async/operators/OperatorFromFunctionals.java#L44 tut das, indem es Ihnen erlaubt, einen beliebigen Callable
zu übergeben.
die in Ihrem Fall würde implementieren, wie:
Observable<String> res = OperatorFromFunctionals.fromCallable(() -> Paper.get("city"));
(Falls Sie sich fragen, diese java8 lambdas gebracht ist von retrolambda auf Android ganz schön den Detaillierungsgrad von Rx zu entfernen.)
Sobald Sie Ihre beobachtbare haben, können Sie sich darauf abonnieren und Ergebnisse erzielen. Um auf dem Hintergrund ausgeführt werden, und die Ergebnisse auf dem UI-Thread abrufen, würden Sie tun:
res.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
AndroidSchedulers
durch rx-android
zur Verfügung gestellt.
.subscribe(city -> Log.d(TAG, city));
, dass ein Abonnement zurückgibt, was nützlich ist, wenn Sie es absagen müssen:
Dann können Sie einfach mit dem Ergebnis calledback werden.
Gesamt:
OperatorFromFunctionals.fromCallable(() -> Paper.get("city"))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(city -> Log.d(TAG, city));
Ich nehme an, "Get" ist eine blockierende Funktion, die auf einem Hintergrund-Thread ausgeführt werden sollte? – njzk2
ja ist es. Alle Funktionen dieses Objekts müssen vom ui thread ablaufen ... get, delete, put, clear. – sirvon