4

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

在 Android 应用程序中使用的 WebView 中,我们需要处理下载 PDF 文件。我看到的行为我认为是有道理的,但这似乎很奇怪,所以我希望有人可以为我验证。

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

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

SetDownloadListener的文档说:

注册渲染引擎无法处理内容时使用的接口,应改为下载。这将替换当前的处理程序。

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

并且,一些后续问题:

  1. 这是常见的情况吗?大多数从 web 视图中下载文件的应用程序真的会两次下载文件吗?(这似乎很昂贵,但我认为它可能正在发生)
  2. 有没有办法重用第一个请求中已经下载的内容,而不是再次请求它?
  3. 为什么 WebView 在第一次请求时不使用 Http HEAD 方法而不是 GET?(我想这会使每个超链接都变成一个两步过程,而且成本也会很高)
  4. 有没有办法可以防止额外下载?也许使用 shouldOverrideUrlLoading() 来拦截请求?
4

1 回答 1

2

最好从您的3. 问题的答案开始:

我认为 WebView 对所有资源都使用 GET 方法。并且只有在它获得此请求的第一个 http 标头之后,WebView 才会检查是否有标头告诉“下载”

(例如标题,如Content-Disposition: Attachment; filename=example.html

如果不存在指向下载的标头,WebView 将在其视图中显示负载和内容。

onDownload如果有下载标头(即使它的值设置为“内联”),则调用它。

回答问题 2

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

回答问题 4

如果你超越shouldInterceptRequest

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

于 2015-09-25T14:52:10.560 回答