Podstawowym obiektem w Rx jest Observable
. Obiekt ten zazwyczaj owija obiekt OnSubscribe
, który jest po prostu rozszerzeniem Action1
, który przyjmuje jako parametr parametr Subscriber
.
Co to wszystko oznacza, że po prostu trzeba zdefiniować klasę, która otacza swoją rozmowę i przekazuje wynik do 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();
}
}
To jest prosty przykład. Teraz chcesz go zawijać, aby można było wywoływać dowolną funkcję, a nie tylko Paper.get("city")
. Coś takiego jak https://github.com/ReactiveX/RxJavaAsyncUtil/blob/0.x/src/main/java/rx/util/async/operators/OperatorFromFunctionals.java#L44 robi to, pozwalając ci przekazać dowolne Callable
.
Które w przypadku byłoby wdrożyć jako:
Observable<String> res = OperatorFromFunctionals.fromCallable(() -> Paper.get("city"));
(W przypadku, gdy zastanawiasz się, to java8 lambdas wniesione do Androidem retrolambda niezły usunąć gadatliwość Rx).
Gdy już zauważysz, możesz zasubskrybować i uzyskać wyniki. Aby wykonać na tle i pobierać wyniki na wątku UI, zrobiłbyś:
res.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
AndroidSchedulers
zapewnia rx-android
.
Następnie można po prostu calledback z wynikiem:
.subscribe(city -> Log.d(TAG, city));
która zwraca subskrypcję, która jest przydatna, gdy trzeba ją anulować.
Ogólnie:
OperatorFromFunctionals.fromCallable(() -> Paper.get("city"))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(city -> Log.d(TAG, city));
Zakładam, że 'get' jest funkcją blokującą, która powinna działać na wątku tła? – njzk2
tak, to jest. wszystkie funkcje tego obiektu muszą zostać usunięte z wątku interfejsu użytkownika ... get, delete, put, clear. – sirvon