2011-04-07 138 views
26

我想知道如何确定何时WebView是完全完成加载。如何确定Android WebView何时完成加载?

让我定义完全

  • 所有重定向发生
  • 可见地显示页面,没有任何尚未加载

不好这个问题的答案:

WebViewClient.onPageFinished() - 如果有重定向这个触发多次加载一个页面。它也会在页面显示之前触发。

PictureListener.onNewPicture() - 每次屏幕更改和AFAICT每次重定向时都会触发。我怎么知道哪一次射击是最后一次?

WebChromeClient.onProgressChanged() - 与onPageFinished相同的问题。 (在David在下面提出这个解决方案后添加)

Thread.sleep(5000) - 应该是显而易见的,为什么这是不可接受的。

当然,上述工作的巧妙组合将是完美的。

为什么我想知道这个问题? 因为我想注入一些JavaScript 一次一旦Webview是完全完成加载。

+1

添加到您的WebViewClient.onPageFinished()错误答案:根据[this](http://stackoverflow.com/a/5172952/725417),它会多次触发**也**如果你在页面中有几个iframe。 – uTubeFan 2011-12-14 00:50:34

+0

@Carlos Man和你在同一个位置。唯一让我更糟糕的是PictureListener已被弃用。你能想出一个解决方案吗?我必须计算webview中的页面总数,我需要将内容宽度与屏幕宽度分开。但是我不能这样做,直到页面完全呈现在屏幕上。任何解决方案 – 2014-09-23 20:15:15

+0

@ArunavhKrishnan上次我看着这是3年前。最后,我想我做了一些类似于接受的答案。祝你好运! – 2014-09-24 22:26:12

回答

8

感谢David Caunt建议查看响应标题。

我已经找到了以下工作得很好:

取代具有的WebView执行HTTP请求,做他们自己,所以你可以检查重定向的HTTP状态代码。遵循重定向链。当你得到一个不是重定向的请求时,设置一个标志并通过webview.loadDataWithBaseURL将数据发送到webview。该标志在WebViewClient.onPageFinished()中检查,以便知道所有重定向都完成。 javascript可以在这个时候注入。当然,页面本身可能会在这个时候做一些JavaScript操作,但很难知道,所以向JavaScript添加延迟(比如说500ms)可以让DOM解决。 setTimeout(function(){/* your code */}, 500)

+1

有用了解!至于页面自己的JavaScript,完成后很难察觉。 – 2011-04-21 10:36:23

+1

@Carlos Rendon +1的优秀轮廓。令人惊讶的是,这并未在WebView或其任何卫星接口中实现。这个特性非常需要,但WebView人员唯一能做的就是弃用PictureListener。任何想法为什么? – uTubeFan 2011-12-12 03:56:09

+0

虽然在那,事实证明,我不是唯一一个梦想[在WebView中访问http响应头](http://stackoverflow.com/questions/3134389/access-the-http-response-headers -in-A-网页视图)。 – uTubeFan 2011-12-12 04:37:58

1

你看过设置自己的WebChromeClient吗?

看起来好像onProgressUpdated可能会在页面完全加载时通知您。

这似乎是Android内置浏览器使用的方法。

+0

感谢您的建议。 Unfortunatley,这与WebViewClient.onPageFinished()具有相同的问题,由于重定向,它会多次触发。例如,在“gmail.com”上,它会在进度== 100时触发3次。 – 2011-04-07 22:42:45

+1

什么时候进度的下一个0值进来?如果响应发出重定向后直接触发,则使用超时并假定您处于最后请求可能是安全的。否则,我会寻找一种方法来获得响应头或类似的东西。 – 2011-04-07 22:44:50

相关问题