来自多个改造请求的Observable <list <someitems>

时间:2018-10-15 13:15:50

标签: android android-studio retrofit rx-java

我从改装请求中获得了Flowable。 我需要在构造时从多个请求中获得一个对象,例如Observable>:

public static Observable<List<CurrencyStamp>> getStampByDay(String symbol, Date date, String... convertsSymbols){
        long count = 0;

        Observable<List<CurrencyStamp>> result = null;
        while (count < secByDay){
            Flowable<CurrencyStamp> item = CoinApi.getCompareApi().getCurrencyHistory(symbol, date.getTime() - count,
                    convertsSymbols).subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread());


            count += secByFiveMin;
        }


        return result;
    }

我需要哪些运算符?

2 个答案:

答案 0 :(得分:2)

我将在这里最大化Maximm Volgin的答案。 (谢谢)

我相信您想将多个可观察的流合并为一个项目列表。我将其分为两部分。

  1. 将流合并为一个。可以使用zip,merge或flatMap运算符来完成此操作,具体取决于顺序/行为Zip Doc Merge Doc FlatMap

  2. 将数据从单个项目转换为列表。这可以通过toList()

  3. 完成

我也建议不要在改装调用中使用flowables / Observables,而应使用Singles。

代码最终将看起来类似于:

科特琳:

fun example(): Single<List<CurrencyStamp >> {
    val count = secByDay.div(secByFiveMin)
    return Observable
        .range(0, count)
        .flatMapSingle { curr ->
            // This should be giving you back a Single
            CoinApi.getCompareApi().getCurrencyHistory(symbol, 
                date.getTime() - curr.mul(secByFiveMin),
                convertsSymbols)
        }.toList()
}

Java:

    Single<List<CurrencyStamp>> sample() {
    val count = secByDay / secByFiveMin;
    return Observable
            .range(0, count)
            .flatMapSingle((Function<Integer, SingleSource<String>>) curr -> 
             // This should be giving you back a Single
            CoinApi.getCompareApi().getCurrencyHistory(symbol, 
                date.getTime() - (curr * secByFiveMin),
                convertsSymbols))
            .toList();
}

**编辑:同样,您应该在可能有错误的流中处理错误(例如网络呼叫),请查看有关该问题的中型文章Error handling article

答案 1 :(得分:1)

类似

Observable
  .range(/* */)
  .flatMap (count) -> { CoinApi
    .getCompareApi(/**/)
    .toObservable()
   }
   .toList()