在 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)

在下一个活动中在 webview 中预加载 URL

Flutter给WebView设置Cookie(Session)

使用 webview 和刷新按钮加载 android

加载 webView 后更改 WKWebView 的 UserAgent