RxJava没有调用subscribe(),但仍然可以正常工作。那怎么可能?

时间:2018-11-29 20:33:39

标签: java-8 rx-java2

我正在使用RxJava和Retrofit来使用不同的端点。我正在使用几个微服务,它们全部利用RxJava和Retrofit来使用其他服务。

我没有使用Observables的经验,因此我在Internet上查看一些示例以学习如何使用它以及自己创建几个服务。我看到总是使用方法subscription()。像这样:

    @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;

            });

在我的工作服务中,我到处搜索并且没有使用subscribe(),但是一切正常。那怎么可能?

如您所见,在该示例中,我需要返回一个Observable来使我的个人代码与我的工作保持一致,但是如果我使用subscribe()方法,它将返回一个Subscription对象,这将不起作用。

这是我工作代码的一部分,您可以看到从未调用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 :(得分:0)

您的retrieveSomethingFactory.observe()调用返回的Observable似乎是热门的Observable,这意味着无论是否订阅,它都会发出项目。您可以阅读有关冷和热可观测物here的精彩文章。