当前位置: 首页 > 知识库问答 >
问题:

我们应该每次都在RxJava中使用调度程序吗

邵畅
2023-03-14

我是RxJava新手,目前正在使用RxJava版本1。我的用例就像我必须进行一次rest API调用(使用rest模板)。因此,使用调度器是更好的主意吗。在这种情况下,每次都可以使用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;
    }

服务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来启动新线程。但我再次使用延迟结果进行即时响应,Spring将把它放在队列中,一旦响应出现,它就会传递响应。

那么,我应该避免调度程序并使其仅在订阅线程上运行,因为我只有一个Rest调用吗?

请建议,因为我真的是新的。

共有3个答案

壤驷麒
2023-03-14

如果您想在可观察操作符的级联中引入多线程,可以通过指示这些操作符(或特定可观察操作符)在特定调度器上操作来实现。

郗奇玮
2023-03-14

默认情况下,Rx是同步的,所有内容都在同一个线程上工作,除非您将执行('subscribeOn')和/或观察('observeOn')分配给在其他线程上运行的调度器。

因此,这实际上取决于手头的任务。例如,改型就是使用自己的调度器。UI只能从Android主线程变异而来。对于单元测试,使用调度器可以方便地手动提前时间。

龙成仁
2023-03-14

RxJava为您提供了对何时何地完成计算的关键控制。使用显式提供的调度器控制观察者链的某些阶段提供了线程安全性,并确保数据在需要时在需要的位置。

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

我建议您传入要使用的调度器,可能是服务类的构造函数。这有时被称为依赖注入,它使您的代码更具可移植性、可测试性,最终更易于维护。

 类似资料:
  • 在RxJava中,有5种不同的调度程序可供选择: > immediate():创建并返回在当前线程上立即执行工作的调度程序。 trampoline():创建并返回一个调度程序,该调度程序将当前线程上的工作排队,以便在当前工作完成后执行。 newThread():创建并返回一个调度程序,该调度程序为每个工作单元创建一个新线程。 计算():创建并返回一个用于计算工作的调度程序。这可以用于事件循环、处理

  • 问题内容: 我们的网站目前正在使用jQuery库,每月的访问量约为100万。我们希望包括以API为中心的方法,因此决定转向Javascript MVC并为此选择了angularJS。 现在我的问题是,我应该在Angular顶部使用jQuery,以便我需要重写最少的DOM操作代码,还是应该以Angular方式重写所有内容?我们使用的是jQuery插件,例如plupload,jQuery UI。等在网

  • objectName.java 主要问题是我无法转到“ageinput.java”文件, activity_ageinput.xml activity_ageinput.xml edit_text.xml 崩溃报告

  • 哈希集由哈希映射支持。从它的JavaDoc: 这个类实现了Set接口,由哈希表(实际上是一个HashMap实例)支持 在查看源时,我们还可以看到它们之间的关系: 因此,一个<code>哈希集 使用而不是,不是更有效吗?进一步考虑的是,如果环境允许使用而不是,我们是否应该完全放弃,直接使用。 触发这些想法的基本问题是以下情况:我有一组具有以下属性的对象: 大型对象集合 如何有效地检查集装箱? 我想到

  • 问题内容: 我有2个线程T1和T2,两者都有不同的工作,因此通常我们更喜欢通过线程Joins完成此任务。 但是我们无需使用join()就可以做到这一点。我们可以在T1线程中添加T2线程的代码。这有什么区别? 问题答案: 主要区别在于,当我们将T2线程与T1连接在一起时,T2执行该任务的时间也可以由T1占用,这意味着它们将并行执行不同的任务。但是,当您在T1中包含T2线程代码时,不会发生这种情况。线

  • 我正在开发一个Android应用程序,我正在使用了解我的应用程序的安装来源。为此,我使用了firstInstall\u referer intent filter和一个我自己定制的过滤器。 是否有可能有两个广播接收器条目带有意图过滤器? 谷歌分析接收器 我的自定义广播接收器。