I. Wprowadzenie do RX
Wszystkie ćwiczenia wykonamy na specjalnie przygotowanej aplikacji do wyszukiwania i gromadzenia zdjęć. Nasz program PhotoCrawler pozwala na zdefiniowanie szeregu słów kluczowych (topics), które następnie są przetwarzane na zapytania do serwisu Google Grafika. Wszystkie interesujące nas zdjęcia są następnie pobierane i zapisywane na dysk.
Cztery kluczowe komponenty (klasy) aplikacji zostały przedstawione na diagramie:

- PhotoDownloader - służy do pobierania zdjęć. Utworzone zdjęcia zwracane są jako obiekty modelu typu Photo.
- PhotoProcessor - umożliwia analizowanie i przetwarzanie obiektów typu Photo (np. tworzenie miniatur).
- PhotoSerializer - zapisuje obiekty typu Photo na dysk w oryginalnym formacie.
- PhotoCrawler - zarządza wszystkimi modułami i obsługuje zapytania o zdjęcia.
Naszym celem będzie usprawnienie działania i rozszerzenie PhotoCrawlera o dodatkowe funkcje przy użyciu biblioteki RxJava.
Na kolejnych stronach znalazły się zadania, które należy wykonać w podanej kolejności. Na końcu każdego polecenia zostały podane odnośniki do operacji ReactiveX, które należy wykorzystać w rozwiązaniu. Dokumentacja ReactiveX nie podaje szczegółowych opisów API dla RxJava 3.x, ale można je znaleźć tutaj (opens in a new tab) oraz w kodzie w formie szczegółowych komentarzy javadoc.
Po zakończeniu pracy nad każdym z ćwiczeń I-III skonsultuj swoje rozwiązanie z prowadzącym.
Uruchomienie aplikacji
-
Zaimportuj projekt
lab-rxdo IntelliJ (File -> Open...). Wszystkie zależności projektu powinny zostać automatycznie pobrane. -
Część zadań będzie wymagała użycia wbudowanego scrapera do pobierania obrazów z Google Grafika. Korzystamy z Google Custom Search JSON API, które wymaga podania indywidualnego wygenerowanego klucza API. Wejdź na stronę z instrukcjami na temat Custom Search API (opens in a new tab) i zaloguj się kontem Google. Następnie w sekcji Klucz interfejsu API znajdź przycisk Zamów klucz i postępuj zgodnie z instrukcjami. Na koniec wklej otrzymany klucz w klasie
CrawlerApp(stałaGOOGLE_CUSTOM_SEARCH_API_KEY).⚠️Uwaga: w darmowej wersji API umożliwia wykonanie 100 zapytań / dzień. Na potrzeby tej i kolejnej laborki w zupełności powinno wystarczyć, ale warto o tym pamiętać. Możesz sprawdzić aktualną wartość wykorzystanego limitu w panelu API konsoli Cloud Platform (opens in a new tab). Z API będziemy korzystać w sekcjach II i III tego laboratorium).
-
Zapoznaj się z klasami:
PhotoCrawler,PhotoDownloaderorazPhotoSerializeriPhotoProcessor. Zwróć uwagę przede wszystkim na publiczne metody udostępniane przez te klasy. -
Uruchom klasę
CrawlerApp. Na dysku w katalogu projektu powinien się pojawić folderphotos, a w nim 5 przykładowych zdjęć pobranych przez aplikację. -
Zaobserwuj, w którym momencie pobrane zdjęcia zapisywane są na dysk. Odpowiedz na pytanie: Jakich modyfikacji w kodzie należałoby dokonać by każde zdjęcie zapisywało się na dysku natychmiast po pobraniu?
Podstawowe operatory RX
-
Zastosuj mechanizm subskrypcji
RxJavado pobrania przykładowych zdjęć:a) Przepisz metodę
PhotoDownloader#getPhotoExamplestak by zwracała obiekt typuObservable<Photo>.b) Po stronie
PhotoCrawler#downloadPhotoExampleszdefiniuj subskrypcję na zwracanym obiekcie w taki sposób by w reakcji na emitowane zdjęcie było ono zapisywane na dysk.Operacje do wykorzystania:
Just(opens in a new tab),Subscribe(opens in a new tab) -
Upewnij się, że zdjęcia są kolejno pobierane i zapisywane na dysk:
a) Zastanów się, w którym momencie wywołuje się metoda
PhotoDownloader#getPhoto.b) Wykorzystaj operację
Map(opens in a new tab) tak by zapewnić, żePhotoDownloader#getPhotozostanie wywołane w trakcie przetwarzania kolejnych zdjęć, a nie podczas tworzeniaObservable.Operacje do wykorzystania:
Map(opens in a new tab)