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 来读取响应标头。因此,双重下载行为似乎是有道理的。
并且,一些后续问题:
- 这是常见的情况吗?大多数从 web 视图中下载文件的应用程序真的会两次下载文件吗?(这似乎很昂贵,但我认为它可能正在发生)
- 有没有办法重用第一个请求中已经下载的内容,而不是再次请求它?
- 为什么 WebView 在第一次请求时不使用 Http HEAD 方法而不是 GET?(我想这会使每个超链接都变成一个两步过程,而且成本也会很高)
- 有没有办法可以防止额外下载?也许使用 shouldOverrideUrlLoading() 来拦截请求?