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);
}
- 我的 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
作为新成员暴露给 Java共 window
.
有了这个新的代码结构,我在从 Java 调用 jsAdapter
时遇到了异常,因为我是从 EDT
而不是 JavaFX Application Thread
调用的。
最终,我将 jsAdapter
调用包装在 Platform.runLater(() -> ...)
中,仅此而已。
使用从 JavaFX WebView 加载的 Java 脚本时,确保始终从 JavaFX 应用程序线程执行 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);
}
- 我的 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
作为新成员暴露给 Java共 window
.
有了这个新的代码结构,我在从 Java 调用 jsAdapter
时遇到了异常,因为我是从 EDT
而不是 JavaFX Application Thread
调用的。
最终,我将 jsAdapter
调用包装在 Platform.runLater(() -> ...)
中,仅此而已。
使用从 JavaFX WebView 加载的 Java 脚本时,确保始终从 JavaFX 应用程序线程执行 Java 脚本调用。