我有一个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调用。