当前位置:  开发笔记 > 编程语言 > 正文

如果我使用RxJava链接多个运算符,我需要为每个运算符调用.subscribeOn()吗?

如何解决《如果我使用RxJava链接多个运算符,我需要为每个运算符调用.subscribeOn()吗?》经验,为你挑选了1个好方法。

这是一个例子:

 return ApiClient.getPhotos()
            .subscribeOn(Schedulers.io())
            .map(new Func1, List>() {
                      @Override
                      public List call(CruiselineAPIResponse response) {
                             //convert the photo entities into Photo objects
                             List photoEntities = response.getPhotos();
                             return Photo.getPhotosList(photoEntities);
                        }
             })
            .subscribeOn(Schedulers.computation())

我是否需要两者.subscribeOn(Schedulers.computation()),.subscribeOn(Schedulers.computation())因为它们适用于不同的Observable?



1> akarnokd..:

无需多次subscribeOn通话; 在这种情况下,第二次调用在功能上是无操作,但在序列的持续时间内仍保留在某些资源上.例如:

Observable.just(1)
.map(v -> Thread.currentThread())
.subscribeOn(Schedulers.io())
.subscribeOn(Schedulers.computation())
.toBlocking()
.subscribe(System.out::println)

会印出类似的东西 ... RxCachedThreadScheduler-2

您可能需要observeOn(Schedulers.computation())将每个值(在本例中为List对象)的观察移动到另一个线程.


所以你需要`getPhotos().subscribeOn(io).observeOn(computation).map(...).observeOn(mainThread)`.那应该在`IO`上执行你的API调用,你在`calculate`上的映射,并在`main`线程上给你输出.请注意,所有这些都假定`getPhotos()`是冷的(即仅通过诸如`defer`之类的机制开始在订阅上运行).
如果它很热,那么在应用`subscribeOn`之前,它会在你调用方法后立即发出网络请求.[我在这个答案中解释一下](http://stackoverflow.com/a/29675387/12170870).
推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有