Witam. W aplikacji Android próbuję wykonać kilka zapytań za pomocą biblioteki Retrofit , żeby pobrać dane w formacie JSON z endpointa na przeglądarce. Żeby zsynchronizować zapytania używam biblioteki Rxjava. Próbuję zrobić to w ten sposób że tworzę dynamicznie listę obiektów Observable a następnie przesyłam je do funkcji Observable.zip() żeby ze wszystkich danych zrobić jeden obiekt, a następnie za pomocą funkcji subscribe() wykorzystać dane z tego obiektu. Niestety ciągle mam błąd w funkcji Observable.zip() . Szukałem długo po internecie rozwiązania ale zazwyczaj są niekompletne lub przestarzałe. Proszę o pomoc i z góry dziękuję :) . Zamieszczam mój kod:
//Tworze liste Observable
final List<Observable<PojoData>> requests = new ArrayList<>();
//Tworze dynamicznie zapytania Retrofit i dodaje je do listy Observable
Iterator iter = nodesId.iterator();
while (iter.hasNext()) {
int nodeNumber = (int) iter.next();
requests.add(service.getData("data",String.valueOf(nodeNumber), String.valueOf(minDay)+","+ String.valueOf(maxDay)));
}
//Funkcja zip w ktorej jest blad
Observable<PojoAllSecondActivity> combined = Observable.zip(requests, new Function<PojoData[], PojoAllSecondActivity>() {
@Override
public PojoAllSecondActivity apply(PojoData[] pojoData) throws Exception {
return new PojoAllSecondActivity(Arrays.asList(pojoData));
}
});
// obiekt Consumer do pozniejszej funkcji subscribe()
Consumer<PojoAllSecondActivity> subscriber = new Consumer<PojoAllSecondActivity>() {
@Override
public void accept(PojoAllSecondActivity pojoAllSecondActivity) throws Exception {
Log.d(TAG, "accept: " + pojoAllSecondActivity.getPojoDataList().get(0).getDataOutputs().get(0).getCreatedat());
}
};
//subscribe()
combined.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
Klasa PojoAllSecondActivity:
public class PojoAllSecondActivity {
public List<PojoData> pojoDataList;
public PojoAllSecondActivity(List<PojoData> pojoDataList) {
this.pojoDataList = pojoDataList;
}
public List<PojoData> getPojoDataList() {
return pojoDataList;
}
public void setPojoDataList(List<PojoData> pojoDataList) {
this.pojoDataList = pojoDataList;
}
}
Klasa PojoData:
public class PojoData {
@SerializedName("output")
@Expose
private List<DataOutput> dataOutputs = null;
public List<DataOutput> getDataOutputs() {
return dataOutputs;
}
public void setOutput(List<DataOutput> dataOutputs) {
this.dataOutputs = dataOutputs;
}
}