Reaktywne strumienie w RxJava
Obsługa wielu strumieni

III. Obsługa wielu strumieni

  1. Dodaj obsługę wielu zapytań o zdjęcia. W tym celu stwórz metody PhotoCrawler#downloadPhotosForMultipleQueries(List<String) oraz PhotoDownloader#searchForPhotos(List<String>). Metoda searchForPhotos(List<String>) powinna również zwracać obiekt Observable<Photo>.
    Możesz wykorzystać i przerobić poniższy kod:

    public List<Photo> searchForPhotos(List<String> searchQueries) throws IOException {
    		List<Photo> photos = new ArrayList<>();
    		for (String searchQuery : searchQueries) {
    			photos.addAll(searchForPhotos(searchQuery));
    		}
    		return photos;
    }

    Operacje do wykorzystania: Merge (opens in a new tab) lub FlatMap (opens in a new tab)

  2. Uruchom aplikację używając przygotowanych metod dla wszystkich zapytań TOPICS, zdefiniowanych w CrawlerApp. Odpowiedz na pytanie: w jakiej kolejności pojawiają się na dysku zdjęcia z podanych zapytań?

  3. Zmodyfikuj metodę PhotoDownloader#searchForPhotos(List<String>) tak aby zapytania były przetwarzane w wielu wątkach. Wykorzystaj Scheduler (opens in a new tab) o nazwie io, zoptymalizowany pod obsługę operacji we/wy.

    💡

    Jeśli uruchomimy pobieranie zdjęć w innych wątkach niż wątek główny aplikacji, metoda main skończy się prawdopodobnie zanim wszystkie operacje dobiegną końca i program zostanie przerwany. Dlatego należy zadbać o to by główny wątek poczekał na pozostałe - najprościej w tym celu dodać na końcu funkcji main wywołanie Thread.sleep(100_000).

Operacje do wykorzystania: SubscribeOn (opens in a new tab)