2017-10-18 132 views
0

我试图实现这样的事情: - 进行两个不同的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(); 
+0

Observable.zip()应该做的伎俩。 – Christopher

+0

或Observable.combineLatest(); – Jerrol

回答

1

使用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()) 
一个转换功能
0

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 
    }) 

快乐编码!