在webview已经获取文件后调用setDownloadListener onDownloadStart吗?

时间:2012-09-21 17:35:42

标签: android android-webview

WebView是否会执行Http获取并下载完整文件然后调用我的onDownloadStart()方法并且我的代码再次下载文件?

在Android应用程序中使用的WebView中,我们需要处理下载PDF文件。我看到了我觉得有意义的行为,但看起来很奇怪,所以我希望有人可以为我验证。

设置WebView时,我们调用setDownloadListener()并创建一个新的DownloadListener来处理onDownloadStart()方法调用。在onDownloadStart()方法中,我们使用HttpURLConnection从我们的Web服务器获取资源。

在网络跟踪中,我看到为同一资源执行了两个Http Get请求。我假设这是因为webview首先对资源进行了Get,然后webview执行自己的处理并确定它无法呈现资源。然后webview调用onDownloadStart()方法,我们第二次检索资源。

SetDownloadListener的文档说:

  

注册无法处理内容时要使用的界面   渲染引擎,应该下载。这将   替换当前的处理程序。

webview不知道它是否可以呈现资源,直到它从服务器获得响应并且可以读取返回的内容类型。因此,它必须首先执行GET或HEAD来读取响应头。因此,双重下载行为似乎有意义。

并且,一些跟进问题:

  1. 这是常见的情况吗?大多数从webview中下载文件的应用程序是否真的下载了两次文件? (这看起来很贵,但我认为可能会发生)
  2. 有没有办法重新使用第一个请求中已下载的内容而不是再次请求它?
  3. 为什么WebView在第一个请求而不是GET上使用Http HEAD方法? (我想这会使每个超链接分为两个步骤,而且也会很昂贵)
  4. 有没有办法阻止额外的下载?也许使用shouldOverrideUrlLoading()拦截请求?

1 个答案:

答案 0 :(得分:1)

当你的 3的答案开始时它会更好。问题:

我认为WebView对所有Ressources使用GET方法。只有在获得此请求的第一个http标头后,WebView才会检查是否有标题告诉"进行下载"

(例如Content-Disposition: Attachment; filename=example.html之类的标题)

如果没有指向下载的标题,WebView将在其视图中显示加载和内容。

如果有下载标题,则会调用

onDownload(即使其值设置为"内联")。

回答问题2

我认为在这种情况下,webview不会加载内容的内容。 目前我不知道重用现有请求的方法。

回答问题4

如果你覆盖shouldInterceptRequest

就像在这个例子中一样:https://stackoverflow.com/a/29811280/2377961 你可以改变这种行为。