В моем приложении для Android я хочу сделать несколько http-запросов, используя retrofit и rxjava для получения данных json.Количество запросов зависит от предпочтений пользователя (от 1 до 40).Каждый запрос независим и возвращает один и тот же тип.Итак, я попытался применить способ, рекомендованный в этом вопросе ( Как сделать несколько запросов и дождаться получения данных от всех запросов в модификации 2.0 - Android ), которая использует функцию zip rx-Джава.Но я не мог найти способ получить и объединить результаты каждого запроса.Тип ответа, который я использовал для отдельного запроса при модернизации, был Response<List<NewsItem>>
, где NewsItem - мой пользовательский объект.(ответ на самом деле - массив json, но в одном запросе модификация автоматически обрабатывает его и преобразует в список моих пользовательских объектов). Ниже я попробовал следующее:
Мой интерфейс API
public interface API {
String BASE_URL = "xxx/";
@GET("news/{source}")
Observable<List<NewsItem>> getNews(@Path("source") String source);
}
Класс Viewmodel для извлечения данных
public class NewsVM extends AndroidViewModel {
public NewsVM(Application application){
super(application);
}
private MutableLiveData<List<NewsItem>> newsLiveData;
public LiveData<List<NewsItem>> getNewsLiveData(ArrayList<String> mySourceList) {
newsLiveData = new MutableLiveData<>();
loadNews(mySourceList);
return newsLiveData;
}
private void loadNews(ArrayList<String> mySourceList) {
Gson gson = new GsonBuilder().setLenient().create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(API.BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
API api = retrofit.create(API.class);
//Gathering the requests into list of observables
List<Observable<?>> requests = new ArrayList<>();
for(String source: mySourceList){
requests.add(api.getNews(source));
}
// Zip all requests
Observable.zip(requests, new Function<Object[], List<NewsItem>>() {
@Override
public List<NewsItem> apply(Object[] objects) throws Exception {
// I am not sure about the parameters and return type in here, probably wrong
return new ArrayList<>();
}
})
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.newThread())
.subscribe(
new Consumer<List<NewsItem>>() {
@Override
public void accept(List<NewsItem> newsList) throws Exception {
Log.d("ONRESPONSE",newsList.toString());
newsLiveData.setValue(newsList);
}
},
new Consumer<Throwable>() {
@Override
public void accept(Throwable e) throws Exception {
Log.d("ONFAILURE", e.getMessage());
}
}
).dispose();
}
}
Это не дает ошибки, но не дает ответа, так как я не смог обработать ответ.Кто-нибудь может мне помочь в объединении результатов каждого запроса?Я искал все вопросы, но не могу найти пример, подобный этому.