我正在使用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;
});
谢谢
答案 0 :(得分:0)
您的retrieveSomethingFactory.observe()
调用返回的Observable似乎是热门的Observable,这意味着无论是否订阅,它都会发出项目。您可以阅读有关冷和热可观测物here的精彩文章。