наблюдаемый - PullRequest
       28

наблюдаемый

0 голосов
/ 15 октября 2018

Я получаю текучий от запроса на модернизацию.Мне нужно получить из нескольких запросов один объект наподобие 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 голосов
/ 15 октября 2018

Я собираюсь выстроить ответ Максима Волгина здесь.(Спасибо)

Я полагаю, у вас есть несколько наблюдаемых потоков, которые вы хотите объединить в список элементов.Я разобью это на две части.

  1. Объединение потоков в один.Это можно выполнить с помощью операторов zip, merge или flatMap в зависимости от порядка / поведения Zip Doc Merge Doc FlatMap .

  2. Преобразование данных из отдельных элементов в список.Это может быть достигнуто с помощью toList ()

. Я бы также предложил не использовать переменные / наблюдаемые для вызовов Retrofit, а Singles.

Код в конечном итоге будет выглядеть следующим образом:

Kotlin:

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

** Редактировать:Также вы должны обрабатывать ошибки в потоке, которые могут иметь ошибки (например, сетевой вызов). Ознакомьтесь с этой средней статьей, в которой говорится об этом Статья об обработке ошибок

0 голосов
/ 15 октября 2018

Что-то вроде

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