Невозможно получить строковые переменные из наблюдаемой, чтобы вставить другую наблюдаемую при использовании rxjava - PullRequest
0 голосов
/ 07 февраля 2019

Я стремлюсь к соединению двух следующих элементов:

1) Получение списка строк символьной переменной, которая привязана к значению "HOSE" из URL https://finfo -api.vndirect.com.vn / stocks .

2) Вывод списка строк на шаге 1) в качестве ввода пути для модифицированного сервиса, который я пишу и вызываю VpbsService с кодом:

Я могу выполнить шаг 1), но никогда не пройду шаг 2. Код для шага 1) и шага 2), как показано ниже

Для шага 1)

strSyms = getStrSymbols ("HOSE") .toString ();

, где public static StringBuilder getStrSymbols(String floorName) {

    StringBuilder sb = new StringBuilder();
    VndinfoService vndService = new RetrofitVndinfoService().create();
    vndService.vndGet()
            .map(u->u.getData())
            .toObservable()
            .subscribeOn(Schedulers.io())
            .flatMap(Observable::fromIterable)
            .filter(u->u.getFloor().equals(floorName))
            .map(s->s.getSymbol())
            .subscribe(u->sb.append(u + ","));
    return sb;
}

Для шага 2) VpbsService vpbsService = new RetrofitVpbsService (). create ();

        Observable.interval(0, 60, TimeUnit.SECONDS)
                .flatMap(
                        i -> vpbsService.vpbsGet(strSyms)
                                .toObservable()
                )
                ..continue

urlBase для RetrofitVndinfoService - "https://finfo -api.vndirect.com.vn / ", а urlBase для RetrofitVpbsService - "https://mobitrade.vpbs.com.vn:8080/". На самом деле, я могу успешно соединить два шага в Java Eclipse, носбой в Android. Проблема в том, что strSyms не содержит символов. Для VpbsService я использую

@GET("getliststockdata/{symbols}")
@Headers({"Accept: application/json"})

Говорите четко, например, если strSyms = "AAA, APC", можно получить URL-адрес https://mobitrade.vpbs.com.vn:8080/getliststockdata/AAA,APC,".В этом случае

        vpbsService.vpbsGet(strSyms) will work fine.

1 Ответ

0 голосов
/ 07 февраля 2019

у вас есть проблема в вашем значении strSyms.реактивные потоки не работают таким образом.Ваш метод не будет ждать, пока событие вернет значение.Вы должны сделать это следующим образом.

public static Observable<StringBuilder> getStrSymbols(String floorName) {   
VndinfoService vndService = new RetrofitVndinfoService().create();
return vndService.vndGet()
        .map(u->u.getData())
        .toObservable()
        .subscribeOn(Schedulers.io())
        .flatMap(Observable::fromIterable)
        .filter(u->u.getFloor().equals(floorName))
        .map(s->{StringBuilder sb = new StringBuilder(); sb.append(s.getSymbol() + ","); return sb;})}

, а затем

Observable.interval(0, 60, TimeUnit.SECONDS)
            .flatMap(
                    i ->  getStrSymbols("HOSE")
            ).flatMap(s -> vpbsService.vpbsGet(s)
                            .toObservable())

, что является грубым потоком.вы все еще можете упростить это imho

...