RxJava не вызывает подписку (), но все еще работает.Как это возможно? - PullRequest
0 голосов
/ 29 ноября 2018

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

У меня нет опыта работы с Observables, поэтому я проверяю некоторые примеры в Интернете, чтобы узнать,как использовать его, а также создать пару сервисов самостоятельно.Я видел, что метод подписки () всегда используется.Примерно так:

    @Setter
    @Getter
    private MovieDetail movieDetail;

    public Observable<Movies> observe() {
    allMoviesClientRetrofit
                        .getMovies()
                        .subscribeOn(Schedulers.io())
                        .observeOn(Schedulers.computation())
            .subscribe(new Observer<Movies>() {

                @Override
                public void onCompleted() {

                    }

                @Override
                    public void onError(Throwable throwable) {

                    }

                    @Override
                    public void onNext(Movies movies) {
                    allMovies = movies;

            });

В службах моей работы я искал везде и подписка () никогда не использовалась, но все работает правильно.Как это возможно?

Как вы видите, в этом примере мне нужно вернуть Observable, чтобы мой личный код соответствовал моей работе, но если я использую метод подписки (), он возвращает объект подписки, и это нене работает

Это часть кода моей работы, где вы можете видеть, что subscribe () никогда не вызывается, но работает

@GetMapping(
        value = "/something",
        produces = MediaType.APPLICATION_JSON_UTF8_VALUE
)
public Single<ResponseEntity<Something>> getSomething() {


    return retrieveSomethingFactory
                    .observe()
                    .toSingle()
                    .map(something -> {
                        return ResponseEntity
                                .status(httpStatus)
                                .body(something);
                    });


class retrieveSomethingFactoryImpl implements retrieveSomethingFactory

@Override
public Observable<Something> observe() {
    return Observable
        .defer(() -> {
            Observable<Something1> something1 = retrieveSomething1Factory
                        .call(link) // Retrofit call
                        .observe()
                        .subscribeOn(Schedulers.io())
                        .observeOn(Schedulers.computation());

            Observable<Something2> something2 = retrieveSomething1Factory
                        .call(link) // Retrofit call
                        .observe()
                        .subscribeOn(Schedulers.io())
                        .observeOn(Schedulers.computation()); 

            return Observable
                        .zip(something1, something2.toList(), (something1, something2) -> {

                            ....
                            ....
                            ....        

                            return something;
                        });                                                       

Спасибо

1 Ответ

0 голосов
/ 30 ноября 2018

Observable, возвращаемая из вашего retrieveSomethingFactory.observe() вызова, кажется горячей наблюдаемой, то есть она будет излучать элементы независимо от того, подписаны они или нет.Вы можете прочитать хорошую статью о холодных и горячих наблюдаемых здесь .

...