0

我有一个 JavaFX 应用程序,可以在 WebView 中加载我自己的 HTML/JS 应用程序。根据事件,我需要从 Java 调用 Javascript,从 Javascript 调用 Java。

从 JS 到 Java 时一切都很好,但从 Java 到 Javascript 时我有一些奇怪的行为。

  • 基本上,这是我如何设置两种语言之间的通信:

_

var javaObjectInjected = typeof javaObject !== "undefined";

if(javaObjectInjected && !javaObjectInitialized) {
    jThalesEventBusInitialized = true;

    const jsAdapter = {
        publishToJs: onPublishToJs
    };

    javaObject.setJsAdapter(jsAdapter);
}
  • 我的 Java 代码将调用publishToJs提供的jsAdapter. 这将导致onPublishToJs.

_

function onPublishToJs(topic, data) {
    alert('Yeah! We are inside JS'); //output_1

    setTimeout(
        function() {
            alert('inside setTimeOut'); //output_2
        },
        1000
    );
}

我确实得到了 output_1,但没有得到 output_2。这就像 setTimeOut 上的回调被丢弃了。

从 Java 调用 JS 时是否有任何已知限制?

4

1 回答 1

0

我重构了我的代码,而不是jsAdapter使用 .java 注入 Java 世界javaObject.setJsAdapter(jsAdapter),而是jsAdapter将 Java 作为window.

使用这种新的代码结构,我在jsAdapter从 Java 调用时遇到异常,因为我是从.EDTJavaFX Application Thread

最终,我把jsAdapter电话包裹起来Platform.runLater(() -> ...),就是这样。

使用从 JavaFX WebView 加载的 Javascript 时,请确保始终从 JavaFX 应用程序线程执行 Javascript 调用。

于 2015-03-26T12:31:09.630 回答