我一直在尝试在Android上执行此代码很长时间,但在这里找不到答案。我是初学者,请理解我。 我使用Retrofit2和RXJava发出多个请求
答案是JSON(数组),它是Java中的CurrencyData
类
[
{
"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
-但它不起作用。
我将非常感谢。
谢谢。
答案 0 :(得分:0)
问题:
您的getCurrencyCodeDate
方法返回了Observable
中的List<CurrencyData>
,并且您正在Observable.zip()
里面的Arrays::asList
拉链函数中使用它。
发生的事情是,您的getCurrencyCodeDate
发出List
个对象,而Arrays::asList
将所有发出的List
包裹在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())