JavaFX+WebView/Javascript:setTimeOut 不起作用调用堆栈来自 Java

JavaFX+WebView/Javascript : setTimeOut does not work call stack comes from Java

我有一个 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);
}

_

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 时是否存在任何已知限制?

我重构了我的代码,而不是使用 javaObject.setJsAdapter(jsAdapter)jsAdapter 注入 Java 世界,而是将 jsAdapter 作为新成员暴露给 Java共 window.

有了这个新的代码结构,我在从 Java 调用 jsAdapter 时遇到了异常,因为我是从 EDT 而不是 JavaFX Application Thread 调用的。

最终,我将 jsAdapter 调用包装在 Platform.runLater(() -> ...) 中,仅此而已。

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