在 WebView 完全加载后执行任务
Posted
技术标签:
【中文标题】在 WebView 完全加载后执行任务【英文标题】:Execute a task after the WebView is fully loaded 【发布时间】:2012-09-14 10:30:32 【问题描述】:是否可以在WebEngine
完成加载后自动运行任务?我知道我可以从WebEngine
获得Worker
来指示加载进度,但似乎反复轮询Worker
不是一个优雅的解决方案(即锁定程序直到页面加载)。我知道我可以使用Task
来做到这一点,所以我可以通过某种方式为WebEngine
获取Task
,并添加一个完整命令执行吗?
【问题讨论】:
【参考方案1】:基于WebView documentation的示例:
webView.getEngine().getLoadWorker().stateProperty().addListener(
new ChangeListener<Worker.State>()
@Override
public void changed(
ObservableValue<? extends Worker.State> observable,
Worker.State oldValue, Worker.State newValue )
if( newValue != Worker.State.SUCCEEDED )
return;
// Your logic here
);
作为 lambda 表达式:
webView.getEngine().getLoadWorker().stateProperty().addListener(
(ObservableValue<? extends Worker.State> observable,
Worker.State oldValue,
Worker.State newValue) ->
if( newValue != Worker.State.SUCCEEDED )
return;
// Your logic here
);
如果您只想监听下一个页面加载而不是每个后续页面加载,请在页面加载后停止监听。
为此,您可以在侦听器开始执行后将其移除(在侦听器代码中):
webview.getEngine().getLoadWorker().stateProperty().addListener(
new ChangeListener<Worker.State>()
@Override
public void changed(
ObservableValue<? extends Worker.State> observable,
Worker.State oldValue, Worker.State newValue)
switch (newValue)
case SUCCEEDED:
case FAILED:
case CANCELLED:
webview
.getEngine()
.getLoadWorker()
.stateProperty()
.removeListener(this);
if (newValue != Worker.State.SUCCEEDED)
return;
// Your logic here
System.out.println("page loaded");
);
【讨论】:
这是不完整的,因为每次页面完成加载时代码都会运行,要么您必须在代码运行后删除侦听器,要么找到另一个解决方案... method();然后是 webEngine.getLoadWorker().stateProperty().removeListener(this); @firephil 我更新了答案以包含您评论中的建议。以上是关于在 WebView 完全加载后执行任务的主要内容,如果未能解决你的问题,请参考以下文章
Flutter给WebView设置Cookie(Session)
Flutter给WebView设置Cookie(Session)