RXAndroid: получить список объектов из сложного списка - PullRequest
0 голосов
/ 01 октября 2018

Я давно пытаюсь выполнить этот код на Android, ищу ответы здесь, но безуспешно.Я начинающий разработчик, и, пожалуйста, поймите меня.Я делаю несколько запросов, используя Retrofit2 и RXJava

Есть ответ, JSON (Array), это класс CurrencyData в Java

[
{ 
"r030":978,"txt":"euro","rate":11.11111,"cc":"EUR","exchangedate":"25.09.2018"
 }
]

MyAPI интерфейс

@GET("/BankService/v1/statdirectory/exchange")
Observable<List<CurrencyData>> getCurrencyCodeDate(@Query("valcode") String valCode, @Query("date") String date);

собирать запросы

List<Observable<List<CurrencyData>>> requests = new ArrayList<>();
requests.add(myApi.getCurrencyCodeDate("USD","20180928"));
requests.add(myApi.getCurrencyCodeDate("EUR","20180928"));

выполнять запросы

 Observable
           .zip(requests, Arrays::asList) 
           .toList()
           .subscribeOn(Schedulers.io()) 
           .observeOn(AndroidSchedulers.mainThread())

Я получил

[[CurrencyData{txt='Dollar USA', rate='1.111'}], [CurrencyData{txt='EURO', rate='2.222'}]]

Мне интересно, как получить List<CurrencyData> со всеми CurrencyData объектов.

Я пытался использовать map и flatMap - но это не работает.Буду очень благодарна.Спасибо.

1 Ответ

0 голосов
/ 01 октября 2018

Проблема: Ваш метод getCurrencyCodeDate возвращает Observable из List<CurrencyData>, и вы используете его внутри Observable.zip() с функцией молнии как Arrays::asList.

Что происходит, Ваш getCurrencyCodeDate испускает List объектов, а Arrays::asList упаковывает все испущенные List s в List.В результате Observable.zip() испускает List<List<>>.

Вдобавок к этому .toList() применяется оператор, который будет снова переносить испущенный List<List<>> в другой List, в результате чего List<List<List<>>> будет возвращаемым типом.

Что вы могли бы сделать, это использовать оператор merge вместо zip и использовать collectInto вместо toList.

Observable
            .merge(requests)
            .collectInto(new ArrayList<CurrencyData>(), ArrayList::addAll)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
...