Android Модернизация + Rx java текучий завершается слишком рано - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь отправить io.reactivex.Flowable из Spring RestController в приложение Android, которое использует Retrofit и Rx java. Если я использую браузер для проверки того, что возвращает конечная точка Rest, я получаю ряд значений, как и ожидалось, но в Android я получаю только одно значение, а затем он вызывает метод onComplete. Чего мне не хватает?

Spring Controller:

@GetMapping("/api/reactive")
    public Flowable<String> reactive() {
        return Flowable.interval(1, TimeUnit.SECONDS).map(sequence -> "\"Flowable-" + LocalTime.now().toString() + "\"");
    }

Модифицированный репозиторий:

@GET("reactive")
    Flowable<String> testReactive();

Основной сервис:

public useReactive() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Values.BASE_URL)
                .addConverterFactory(JacksonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();

        userRepository = retrofit.create(UserRepository.class);

        Flowable<String> reactive = userRepository.testReactive();
        Disposable disp = reactive.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(new ResourceSubscriber<String>() {
                    @Override
                    public void onNext(String s) {
                        logger.log(Level.INFO, s);
                        Toast.makeText(authActivity, s, Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onError(Throwable t) {
                        t.printStackTrace();
                    }

                    @Override
                    public void onComplete() {
                        logger.log(Level.INFO, "Completed");
                        Toast.makeText(authActivity, "Completed", Toast.LENGTH_SHORT).show();
                    }
                });
    }

После вызова Метод useReactive (), я получаю только одно значение «Flowable -...», а затем «Завершено».

1 Ответ

1 голос
/ 10 апреля 2020

Несмотря на то, что служба Retrofit имеет тип возврата Flowable<String>, при вызове testReactive() будет выполнен только один HTTP-вызов на устройстве Android.

Тип Flowable предназначен только для совместимости, на практике это будет Flowable, который выдает одно значение, а затем завершается.

Так работает Retrofit.

Вам нужно будет найти другое решение, если вы хотите постоянно получать новые значения, которые отправляются с сервера, например GRP C или опрос сервера.

...