【发布时间】:2012-09-21 17:35:41
【问题描述】:
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() 来拦截请求?
【问题讨论】:
-
Another question with a similar subject 最近没有得到任何可接受的答案(链接供参考)。
-
你好。你怎么修好它的?我的意思是防止对服务器的双重请求?我知道我需要阻止的 url。
-
我们从未修复它。我们只是忍受双重下载。顺便说一句,这大约是十年前的事了。我不确定这种行为是否仍然存在,或者现在是否有不同的解决方法。