在JavaFX2中使用WebEngine
时,我注意到它有时会卡住。假设我正在制作一个搜寻器,该搜寻器只是在页面上找到超链接,然后访问它们以递归方式进行操作,从而跟踪我们访问过哪些链接以及哪些链接已经在边界上。在运行我的代码时,执行有时会在任意时刻挂起。
我已经以workDoneProperty
和exceptionProperty
的监听器的形式向我的项目中添加了一些调试代码,并打印了loadWorker
的stateProperty
的每个转换。然后我注意到有时引擎会停止URL的中间加载(状态停留在RUNNING
中,并且没有更多的workDone
更新)。我假设这是由于超时或其他原因造成的,但我已经停止等待,等待5分钟后是否确实是超时。exceptionProperty
似乎不会生成任何事件,而且webEngine
不会转换为FAILED
或CANCELLED
,它只是停止。我想知道这是否可能是库中的争用条件,或者我是否缺少某些东西……有人知道如何解决此问题吗?对于我的应用程序来说,引擎不仅会随机停止是非常重要的...
编辑:从控制台添加了输出:
Work done: -1
Engine Load Worker transitioning into state: READY
Work done: 0
Engine Load Worker transitioning into state: SCHEDULED
Engine Load Worker transitioning into state: RUNNING
Work done: 21
Work done: 24
Work done: 24
Work done: 57
Work done: 72
BUILD STOPPED (total time: 9 minutes 32 seconds)
最佳答案
我遇到了同样的问题。
当我在一个方法内部创建一个本地“WebView”实例而没有对其进行硬引用时,似乎发生了这种情况(因此,在方法调用结束后,它可能是由GC编写的。)
我通过为我的WebView实例使用静态变量解决了该问题(我正在JAVAFX线程中初始化-否则会出现异常)
private static WebView webview;
public static void someMethod() {
try {
if (webview == null){
webview = new WebView();
}
WebEngine webEngine = webview.getEngine();
webEngine.getLoadWorker().stateProperty().addListener(
new ChangeListener<State>() {
public void changed(ObservableValue ov, State oldState, State newState) {
System.out.println("newState = " + newState);
if (newState == State.SUCCEEDED) {
System.out.println(webEngine.getLocation());
}
}
});
webEngine.load("http://javafx.com");
} catch (Exception ex) {
System.err.print("error " + ex.getMessage());
ex.printStackTrace();
}
}