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

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

本文关键字:堆栈 Java 调用 不起作用 Javascript setTimeOut JavaFX+WebView      更新时间:2023-09-26

我有一个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代码将在提供的jsAdapter上调用方法publishToJs。这将导致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时是否存在已知的限制?

我重构了代码,并没有使用javaObject.setJsAdapter(jsAdapter)jsAdapter注入Java世界,而是将jsAdapter作为window的新成员公开给Java。

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

最终,我将jsAdapter调用封装在Platform.runLater(() -> ...)中,就这样

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