W tym artykule wyjaśnię podstawy RxJavy na przykładach. Ten artykuł jest dla początkujących użytkowników RxJavy. Z drugiej strony, jeśli wiesz już coś o RxJava, ten artykuł jest dobry do sprawdzenia twojej wiedzy.
RxJava jest implementacją w maszynie wirtualnej Java biblioteki ReactiveX do tworzenia asynchronicznych i opartych na zdarzeniach programów przy użyciu obserwowalnych sekwencji.
Budulcem RxJava są obserwowalne i subskrybenci. Obserwowalne są używane do emitowania elementów, a Subskrybent jest używany do konsumowania tych elementów. Być może niektórzy z was pomyślą: „Hmmm to jest tak podobne do standardowego wzorca Observable”. I tak jest, ale RxJava robi to znacznie lepiej i ma więcej opcji. Na przykład, Observable często nie zaczynają emitować elementów dopóki ktoś ich nie zasubskrybuje. Jest to wspaniała cecha, ponieważ w ten sposób powinieneś zaoszczędzić swoje występy.
RxJava działa w ten sposób. Subskrybent zapisuje się do Observable, następnie Observable wywołuje Subscriber.onNext() dla dowolnej liczby elementów, jeśli coś pójdzie nie tak, tutaj jest Subsciber.onError() i jeśli wszystko zakończy się dobrze, tutaj jest Subscriber.onCompleted(). Widzisz, że to jest proste!
Zamknij się! Daj mi jakieś wymyślne kody!
Przykład 1
W tym przykładzie stworzymy podstawowe Observable i Subscriber, a następnie połączymy je i zobaczymy, co się stanie. Uwaga spoiler! Coś niesamowitego…
Stwórzmy podstawowe Observable:
utworzone Observable wyemituje „Blue Factory” String, a następnie zakończy działanie. String „Blue Factory” zostanie odebrany w metodzie onNext() subskrybenta. Teraz stwórzmy Subscriber.
Subscriber odbiera wartość String w metodzie onNext() i wypisuje ją, również String „I’m done” wypisuje się po wywołaniu metody onCompleted().
Teraz je połącz.
Result:
I/System.out: Blue Factory
I/System.out: I’m done
Gdy dzieje się subskrypcja, myObservable wywołuje metody mySubscription onNext() i onComplited(). Wynikiem są wyjścia „Blue factory” i „I’m done”, po czym wszystko się zatrzymuje i kończy.
Czy mogę to zrobić prościej?
Oczywiście! Możesz to zrobić!
Możesz zauważyć, że tworzenie myObservable ma zbyt dużo kodu i wygląda niechlujnie. RxJava daje nam kilka wymyślnych skrótów.
Kilka z tych skrótów to metody takie jak Observable.just() i Observable.from();
Observable.just() emituje tylko jeden pojedynczy element, a Observable.from() emituje jeden element po drugim z listy elementów.
Zamknij się! Daj mi jakiś wymyślny kod!
Przykład 2
W tym przykładzie zrobimy to samo co w Przykładzie 1, ale teraz z mniejszą ilością kodu.
Utwórzmy nasz nowy wymyślny, dobrze wyglądający Observable:
Wow! Wygląda na to, że nasz Observable trochę schudł!
Twórzmy Subscriber:
Subscriber jest taki sam!
Teraz połącz je i czekaj, aż stanie się magia!
Wynik:
I/System.out: Blue Factory
I/System.out: I’m done
Jak widać, udaje nam się wykonać nasze zadanie, i zrobić dokładnie to samo przy użyciu mniejszej ilości kodu.
Zamknij się! Daj mi jakiś wymyślny kod!
Przykład 3
W tym przykładzie zrobimy coś trochę inaczej z Observable.from(). Chodzi o to, aby wypisać ciągi „Blue”, „Factory”, „Blog”, „Post”.
Przypomnijmy sobie czym jest Observable.from(). Observable.from() odbiera listę elementów i wypisuje na niej element po elemencie, więc Observable.from() jest dokładnie tym, czego potrzebujemy!
Najpierw stworzymy ArrayList z łańcuchami:
Stwórzmy ten Observable.from(), shall we?
Jak widać, Observable.from() otrzymuje jako argument ArrayList załadowaną Stringami. Teraz stwórzmy Subscriber i połączmy je ze sobą, i czekajmy na magię.
Result:
I/System.out: Blue
I/System.out: Factory
I/System.out: Blog
I/System.out: Post
Jak widzisz, znowu udało nam się wykonać nasze zadanie!
Wszystko, czego nauczyłeś się do tej pory, to podstawowe sztuczki, ale teraz zrobimy kilka „trudniejszych” sztuczek!
Czym są Operatory w Rx?
Operatory to metody stworzone do rozwiązywania problemów z transformacjami i obsługą wywołań API. Pokażę jeden prosty przykład transformacji z Mapą, a być może w kilku kolejnych artykułach przykłady obsługi wywołań API z Retrofit, RxJava na MVP architecture pattern.
Na przykład dołączmy do naszego „Blue Factory” String z ” Blog Post”. Możemy to zrobić na kilka sposobów.
Pierwszy sposób:
Możemy to zrobić w Observable, ale Observable ma emitować elementy, a nie je zmieniać.
Drugi sposób:
Ta sama historia, Subscriber nie miał zmieniać elementów.
Rozwiązaniem jest dodanie jeszcze jednego kroku, poprzez dodanie Operatora. Operator jest dodatkowym krokiem pomiędzy Observable i Subscriber, gdzie obiekt może być przekształcony.
Zróbmy to więc we właściwy sposób!
Zamknij się! Daj mi jakiś wymyślny kod!
Przykład 4
Najpierw stwórzmy Observable:
Zauważ, że myObservable emituje tylko jeden niezmieniony element.
Teraz stwórzmy Operator, dla tego przykładu najlepszym rozwiązaniem jest użycie operatora Map. Operator Map może przekształcić nasz obiekt w dowolny sposób i zwrócić go do Subskrybenta.
W wywołaniu metody (String s) dokonywana jest transformacja String „Blue Factory”.
A oto Subscriber:
Result:
I/System.out: Blue Factory Blog Post
Ten przykład reprezentuje maleńki ułamek tego, co potrafią Operatory. Na przykład, operator Map może być ułożony na stosie wiele razy, jak w przykładzie poniżej:
Zamknij się! Give me some fancy code!
Przykład 5
Operatory mogą również zmieniać typ emitowanego elementu jak w przykładzie poniżej:
Shut up! Daj mi jakiś wymyślny kod!
Przykład 6
W tym przykładzie Observable wyemituje String „5”, a Operator przekształci go na Integer 5. Let’s crate Observable.
Zauważmy, że typ myObservable jest Observable i Observable emituje String.
Twórzmy operator Map!
Zauważmy, że metoda operator Map call(String s) otrzymuje String i zwraca Integer.
Zakładamy Subscriber i łączymy je ze sobą.
Typ Subscriber jest taki sam jak typ Observable, a typ zwracający Operators (Integer).
Tutaj pokazuję tylko mały ułamek obrazu. Z operatorami możesz zrobić wszystko co chcesz! A najlepsze w tym wszystkim jest to, że RxJava posiada mnóstwo różnych operatorów. Tutaj możesz sprawdzić wszystkie operatory: https://github.com/ReactiveX/RxJava/wiki/Alphabetical-List-of-Observable-Operators.
W podsumowaniu Operatory są potężne dla transformacji obiektów i polerowania danych, a po tym wszystkim, twój kod będzie wyglądał ładnie i czysto!
Co mogę zrobić z RXJava?
Możesz zrobić wszystko co chcesz, ponieważ twój Observable może być wszystkim, może być: String, Integer, wywołanie API, kliknięcie itp. W miarę postępów jako programista Androida będziesz używał RxJava głównie do wywołań API i dla widżetów androida. RxJava zapewnia łatwą obsługę API, ponieważ nie musisz się martwić o gwintowanie i możesz łańcuchować kilka żądań i uzyskać wynik na pojedynczym subskrybencie. Z RxJava można obsługiwać niektóre zachowania widżetów, na przykład co widżet zrobi po pięciokrotnym naciśnięciu, lub można utworzyć obserwowalne, które będą emitować String co 4 sekundy z wejścia EditText, i wiele innych wymyślnych rzeczy. Mam nadzieję, że ten artykuł dał ci podstawy RxJavy i mam nadzieję, że będziesz kontynuował eksplorację RxJavy w przyszłości.