【问题标题】:RxJava poor performance with JavaFxRxJava 与 JavaFx 的性能差
【发布时间】:2019-09-15 02:59:02
【问题描述】:

我正在使用RxJavaJavaFx,我不禁注意到性能不佳,每当我单击执行taskbutton 时,button 一直突出显示直到方法完成,应用程序的行为就像它在 UI 线程上运行该方法一样。当我用普通的 Java thread 替换相同的 Rx 调用时,我注意到性能要好得多,按钮突出显示不会保持不变,并且整体应用程序转换看起来要好得多。以下是我的Rx 通话示例

   Single.just(someMethod())
                .observeOn(JavaFxScheduler.platform())
                .subscribeOn(Schedulers.io())
                .subscribe(new DisposableSingleObserver<>() {
                    @Override
                    public void onSuccess(Result result) {
                        //get my result
                        this.dispose();
                    }

                    @Override
                    public void onError(Throwable throwable) {
                        logger.error(throwable);
                        this.dispose();
                    }
                });

我在Android 中使用RxJava,与此相比,它的表现非常好。谁有解决办法?

【问题讨论】:

  • 您正在调用Single.just(someMethod()),这意味着在调用Single.just 之前评估someMethod() 的结果。换句话说,结果被急切地评估(在任何创建Single 的线程上)。您应该使用 Single 的一种方法,使值的评估变得惰性(例如 Single.fromCallable 或其他东西——对 RxJava 不太熟悉)。
  • @Slaw 很有趣,我从来不知道。
  • 注意这不是 RxJava 特有的。您将方法调用的结果作为参数传递给另一个方法。这需要在第二种方法之前评估第一种方法,否则您没有结果可以作为参数传递。

标签: java javafx rx-java java-11


【解决方案1】:

在组装期间,someMethod() 将被热切评估。您希望将其评估推迟到订阅发生时。不知道在RxJava 中是不是这样,但是在Reactor 中,你可以使用:Mono.defer() -&gt; someMethod()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-23
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 2019-11-15
    • 2020-10-15
    相关资源
    最近更新 更多