我们每次都应该在RxJava中使用Scheduler吗?

时间:2017-12-21 12:20:36

标签: rx-java

我是RxJava的新手,目前正在使用RxJava的第1版。 我的用例就像我必须进行一次其他API调用(使用rest模板)。因此,在这种情况下每次使用Schedulers.computation()或任何调度程序更好。

我的课程就像

  

SampleController.java

@RequestMapping(value = "/", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    public DeferredResult<List<Response>> getresponse() {
        DeferredResult<List<Response>> response = new DeferredResult<>();
            service
              .fetchJson()
              .subscribe(result -> response.setResult(result));
        return response;
    }
  

Service.java

@Override
    public Observable<List<Response>> fetchJson() {
        Observable<List<Response>> list = Observable.<List<Response>>create(
                subscriber -> subscriber.onNext(this.invokeRestCall(APIURL)))
                .subscribeOn(Schedulers.from(executor));*/
        return list;
    }

    private List<Response> invokeRestCall(String APIURL) {  

        Response[] responses = restTemplate.getForObject(APIURL, Response[].class);
        return Arrays.stream(responses).collect(Collectors.toList());
    }

这里我使用Schedulers来启动新线程。但是我再次使用deffered结果进行即时响应,spring将把它放入队列中,一旦响应就会响应。

我应该避免调度程序并使其仅在订阅者线程上运行,因为我只有一次休息调用吗?

请建议,因为我对此很陌生。

3 个答案:

答案 0 :(得分:0)

RxJava为您提供关于计算完成的时间和地点的关键控制。使用显式提供的调度程序来控制观察者链的某些阶段可提供线程安全性,并确保数据在您需要时可以在何处进行。

话虽这么说,Schedulers静态类方法返回全局已知的调度程序。在进行测试时,或者当您想在不同的上下文中重用代码时,使用全局变量是一个严重的障碍。

我建议您传入要使用的调度程序,可能在服务类的构造函数中。这有时称为依赖注入,它使您的代码更易于移植,更易于测试,并且最终更易于维护。

答案 1 :(得分:0)

默认情况下,Rx是同步的,一切都在同一个线程上运行,除非将执行('.subscribeOn')和/或观察('.observeOn')分配给在其他线程上运行的调度程序线程。

所以这真的取决于手头的任务。例如,Retrofit使用自己的调度程序。 UI可能只能从Android主线程变异。对于单元测试,可以方便地使用调度程序来手动提前计时。

答案 2 :(得分:0)

如果要将currying引入到Observable运算符级联中,可以通过指示这些运算符(或特定的Observable)对特定调度程序进行操作来实现。