我有一个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);
}
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时是否存在任何已知限制?
答案 0 :(得分:0)
我重构了我的代码,而不是使用jsAdapter
将javaObject.setJsAdapter(jsAdapter)
注入Java世界,而是将jsAdapter
作为window
的新成员公开给了{。}。
使用这种新的代码结构,我从Java调用jsAdapter
时遇到异常,因为我是从EDT
而不是JavaFX Application Thread
进行的。
最后,我将jsAdapter
电话打包在Platform.runLater(() -> ...)
中,就是这样。
使用从JavaFX WebView加载的Javascript时,请确保始终从JavaFX应用程序线程执行Javascript调用。