首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaFX WebEngine超时处理

JavaFX WebEngine超时处理
EN

Stack Overflow用户
提问于 2015-03-04 10:40:18
回答 2查看 1.5K关注 0票数 0

我想知道是否有人找到了正确处理JavaFX 8 (jdk 1.8.0_31) WebView中超时的方法。问题如下:

假设您有一个WebView实例,然后告诉load一个特定的URL。此外,您希望在文档加载后处理它,因此您可以将一个侦听器附加到驱动web视图的stateProperty of LoadWorker of WebEngine。但是,某个网站在加载过程中会超时,这会导致stateProperty过渡到Worker.State.RUNNING,并且仍然停留在那里。

然后,网络引擎就完全卡住了。我希望实现一个检测超时并取消加载的系统。为此,我考虑在progressProperty中添加一个侦听器,并使用某种形式的Timer。其想法如下:

我们在web视图上启动一个加载请求。超时计时器立即开始运行。在每次进度更新时,计时器都会被重置。如果进度达到100%,则计时器无效并停止。但是,如果计时器完成(因为在某个时间范围内没有进度更新,我们假设超时),加载请求将被取消并引发错误。

有人知道实现这一点的最佳方法吗?

亲切的问候

更新

我已经生成了一个代码片段,其中包含了问题中描述的行为。唯一困扰我的是我无法取消LoadWorker:调用LoadWorker#cancel挂起(函数永远不会返回)。

代码语言:javascript
复制
public class TimeOutWebEngine implements Runnable{

    private final WebEngine engine = new WebEngine();
    private ScheduledExecutorService exec;
    private ScheduledFuture<?> future;
    private long timeOutPeriod;
    private TimeUnit timeOutTimeUnit;

    public TimeOutWebEngine() {
        engine.getLoadWorker().progressProperty().addListener((ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> {
            if (future != null) future.cancel(false);
            if (newValue.doubleValue() < 1.0) scheduleTimer();
            else cleanUp();
        });
    }

    public void load(String s, long timeOutPeriod, TimeUnit timeOutTimeUnit){
        this.timeOutPeriod = timeOutPeriod;
        this.timeOutTimeUnit = timeOutTimeUnit;
        exec = Executors.newSingleThreadScheduledExecutor();
        engine.load(s);
    }

    private void scheduleTimer(){
        future = exec.schedule(TimeOutWebEngine.this, timeOutPeriod, timeOutTimeUnit);
    }

    private void cleanUp(){
        future = null;
        exec.shutdownNow();
    }

    @Override
    public void run() {
       System.err.println("TIMED OUT");
//     This function call stalls...
//     engine.getLoadWorker().cancel();
       cleanUp();
    }
}
EN

回答 2

Stack Overflow用户

发布于 2015-03-04 12:16:37

我不认为你现在能正确处理超时问题。看看这个方法。如您所见,它具有setReadTimeout方法的硬编码值。这是否意味着SocketTimeoutException异常将在加载站点一个小时后引发。只有在该事件发生后,状态才会更改为“失败”。

因此,您现在只有一种方法:尝试像上面描述的那样使用计时器来破解这个问题。

尝试在JavaFX问题跟踪器中创建问题。可能是任何人在五年后修好它..。

票数 0
EN

Stack Overflow用户

发布于 2015-04-28 11:01:59

我也有同样的问题,使用了一个简单的PauseTransition。同样的行为,也没那么复杂。=)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28852339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档