我通过
bridge在Java中创建一个实例变量来解决该问题,该实例变量保存通过
JavascriptBridge发送给Javascript
的实例
setMember()。这样,可以防止实例的垃圾回收。
相关代码段:
public class JavascriptBridge { public void callback(String data) { System.out.println("callback retrieved: " + data); }}private JavascriptBridge bridge;@Overridepublic void start(Stage primaryStage) throws Exception { WebView webView = new WebView(); primaryStage.setScene(new Scene(new AnchorPane(webView))); primaryStage.show(); final WebEngine webEngine = webView.getEngine(); webEngine.load(getClass().getClassLoader().getResource("page.html").toExternalForm()); bridge = new JavascriptBridge(); webEngine.getLoadWorker().stateProperty().addListener((observablevalue, oldValue, newValue) -> { if (newValue == State.SUCCEEDED) { JSObject window = (JSObject) webEngine.executescript("window"); window.setMember("javaApp", bridge); } }); webEngine.setonalert(event -> { System.out.println(DATE_FORMAT.format(new Date()) + " alerted: " + event.getData()); });}
尽管代码现在可以顺利运行(也可以与Leaflet一起使用),但我仍然对这种意外行为感到恼火…
编辑:自Java
9起就记录了对此行为的解释(感谢@dsh的澄清注释!我当时正在使用Java
8,不幸的是手头没有此信息…)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)