在JavaFX2中使用WebEngine时,我注意到它有时会卡住。假设我正在制作一个搜寻器,该搜寻器只是在页面上找到超链接,然后访问它们以递归方式进行操作,从而跟踪我们访问过哪些链接以及哪些链接已经在边界上。在运行我的代码时,执行有时会在任意时刻挂起。

我已经以workDonePropertyexceptionProperty的监听器的形式向我的项目中添加了一些调试代码,并打印了loadWorkerstateProperty的每个转换。然后我注意到有时引擎会停止URL的中间加载(状态停留在RUNNING中,并且没有更多的workDone更新)。我假设这是由于超时或其他原因造成的,但我已经停止等待,等待5分钟后是否确实是超时。
exceptionProperty似乎不会生成任何事件,而且webEngine不会转换为FAILEDCANCELLED,它只是停止。我想知道这是否可能是库中的争用条件,或者我是否缺少某些东西……有人知道如何解决此问题吗?对于我的应用程序来说,引擎不仅会随机停止是非常重要的...

编辑:从控制台添加了输出:

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();
    }
}

10-08 16:18