RXAndroid:从困难的列表中获取列表对象

时间:2018-10-01 14:20:02

标签: java android rx-java2

我一直在尝试在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感兴趣。

我尝试使用mapflatMap-但它不起作用。 我将非常感谢。 谢谢。

1 个答案:

答案 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())