结合多个可观察结果
问题描述:
我试图实现这样的事情: - 进行两个不同的API调用并将结果组合到一个列表中。每次调用的结果都是一个HashMap,我有一个函数可以将它转换为一个列表。我现在想要做的是将列表合并为一个,但我遇到了困难。结合多个可观察结果
这是我的改装服务看起来像:
@GET("data/price?fsym=ETH")
fun getETHRates(@Query("tsyms") tsyms : String) : Single<HashMap<String,
Double>>
@GET("data/price?fsym=BTC")
fun getBTCRates(@Query("tsyms") tsyms: String) : Single<HashMap<String, Double>>
我已经能够单独打的电话,并将结果转换成一个列表(请纠正我,如果可以做到这一点更好)这样的:
val btcRates: Single<List<Currency>> = cryptoApi.getBTCRates(countries)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap { result: HashMap<String, Double> ->
[email protected] Single.just(createCurrencyObjects
("BTC",
result))
}
val ethRates: Single<List<Currency>> = cryptoApi.getETHRates(countries)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap { result: HashMap<String, Double> ->
[email protected] Single.just(createCurrencyObjects("ETH", result))
}
这是将结果变成一个列表功能:
fun createCurrencyObjects(from: String, map: HashMap<String, Double>): List<Currency> {
val list = ArrayList<Currency>(0)
for (key in map.keys) {
val amount: Double? = map.get(key)
list.add(Currency(0, from, key, amount!!))
}
return list;
}
我现在想要做的是将两个调用的列表结合起来,然后将其保存到数据库中。我如何与RxJava进行这种组合?
我已经试过这样的事情,但我不断收到错误消息:
val apiCall: Disposable = Observable.concat(ethRates, btcRates)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext { values: List<Currency> ->
run {
App.database?.currencyDao()?.insertAllCurrencies(values)
}
}
.doOnError { e -> e.printStackTrace() }
.subscribe();
答
使用zip
运营商可以结合两种Single
的结果,并申请返回一个列表
Single.zip(
rates1,
rates2,
BiFunction<List<Currency>, List<Currency>, List<Currency>> { x, y ->
// return your list
}
).doOnSuccess { list -> // save your data }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
一个转换功能
答
gyosida的答案是正确的。下面是另一个示例,显示了Zip的一般用法:
val single1 = Single.just(mutableListOf("one", "two", "three"))
val single2 = Single.just(mutableListOf("four", "five", "six"))
val single = Single.zip(single1, single2, BiFunction {
a: MutableList<String>, b: MutableList<String> ->
a.addAll(b)
[email protected] a
})
快乐编码!
Observable.zip()应该做的伎俩。 – Christopher
或Observable.combineLatest(); – Jerrol