Лучший способ объединить одиночные игры в RxJava2 на Android? - PullRequest
0 голосов
/ 25 ноября 2018

Я новичок в RxJava, и мне интересно, есть ли более идиоматический способ выполнения того, что делает метод, показанный ниже.

private Flowable<String> fetchTopMovies(Context context, @IntRange(from = 1) int firstPage, @IntRange(from = 1) int lastPage) {
    checkArgument(firstPage > 0, "first page must be at least 1");
    checkArgument(lastPage > 0, "first page must be at least 1");
    checkArgument(lastPage >= firstPage, "last page cannot be less than first page");

    JsonFetcher jsonFetcher = JsonFetcher.getInstance(context);
    Flowable<String> mergedJsonsFlowable = Flowable.empty();

    for (int page = 0; page <= lastPage; page++) {
        String url = "https://api.themoviedb.org/3/movie/top_rated?" +
                "api_key=4&" +
                "language=en-US&" +
                "page=" + page;

        Single<String> jsonSingle = jsonFetcher.fetchJson(url);
        mergedJsonsFlowable = mergedJsonsFlowable.mergeWith(jsonSingle);
    }

    return mergedJsonsFlowable;
}

Как вы можете видеть, я просто собираю синглы и объединяю их в Flowableрукой.Есть ли лучший способ сделать это без «разрыва цепи»?

1 Ответ

0 голосов
/ 25 ноября 2018

Я думаю, у вас есть идеальный вариант использования для Flowable.range():

private Flowable<String> fetchTopMovies(Context context, @IntRange(from = 1) int firstPage, @IntRange(from = 1) int lastPage) {
   ...
   JsonFetcher jsonFetcher = JsonFetcher.getInstance(context);

   return Flowable.range(0, lastPage)
     .map(i ->  "https://api.themoviedb.org/3/movie/top_rated?" +
       "api_key=4&" +
       "language=en-US&" +
       "page=" + i)
     .flatMapSingle(url -> jsonFetcher.fetchJson(url));
}
...