Запускать различное количество наблюдаемых последовательно - PullRequest
0 голосов
/ 17 июня 2019

У меня есть такой метод

    public void loadData(String city) {
    mWeatherDataSource.getWeatherData(city)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeWith(new DisposableSingleObserver<List<WeatherResponse>>() {
                @Override
                public void onSuccess(List<WeatherResponse> weatherResponses) {
                }
                @Override
                public void onError(Throwable e) {
                }
            });
}

и

public Single<List<WeatherResponse>> getWeatherData(String city) {
    return mApiService.getDataWeather(city, API_KEY);
}

Это работает нормально, но я хочу, чтобы loadData работал с параметром String... city (или List), который запускает getWeatherData более одного раза.

Результат должен быть объединен (например):

@Override
public void onSuccess(List<WeatherResponse> weatherResponses) {
}

1 Ответ

0 голосов
/ 18 июня 2019

Вы можете сделать это следующим образом:

  1. Используйте оператор fromArray для передачи в поток каждого города из массива String.. cities;
  2. Используйте оператор flatMapSingle для вызоваВаш API для каждого города отправляется
  3. Используйте flatMap и fromIterable, чтобы получить извлеченный список WeatherResponse и отправлять по одному в потоке
  4. Используйте оператор toList, чтобы сгруппировать всеих в один список
    public void loadData(String... cities) {
        Observable.fromArray(cities)
                .flatMapSingle((Function<String, SingleSource<List<WeatherResponse>>>) city -> getWeatherData(city))
                .flatMap((Function<List<WeatherResponse>, ObservableSource<WeatherResponse>>) Observable::fromIterable)
                .toList()
                .subscribe(list -> {
                    // do whatever with your single list with all items
                });
    }
...