WebView 是否会执行 Http Get 并下载完整文件,然后调用我的 onDownloadStart() 方法,并且我的代码再次下载文件?
在 Android 应用程序中使用的 WebView 中,我们需要处理 PDF 文件的下载。我看到的行为我认为是有道理的,但看起来很奇怪,所以我希望有人可以为我验证。
设置 WebView 后,我们调用 setDownloadListener() 并创建一个新的 DownloadListener 来处理 onDownloadStart() 方法调用。在 onDownloadStart() 方法中,我们使用 HttpURLConnection 从 Web 服务器获取资源。
在网络跟踪中,我看到对同一资源执行了两个 Http Get 请求。我认为这是因为 webview 首先对资源执行 Get,然后 webview 进行自己的处理并确定它无法渲染资源。然后,webview 调用 onDownloadStart() 方法,我们再次检索资源。
的文档设置下载监听器 say:
注册无法处理内容时使用的接口
渲染引擎,应该下载。这会
替换当前处理程序。
webview 不知道它是否可以渲染资源,直到它收到服务器的响应并可以读取返回的内容类型。因此,它必须首先执行 GET 或 HEAD 来读取响应标头。因此,双重下载行为似乎是有道理的。
并且,一些后续问题:
- 这是常见情况吗?大多数从 Web 视图中下载文件的应用程序真的会下载文件两次吗? (这看起来很昂贵,但我认为这可能会发生)
- 有没有办法重用第一次请求中已下载的内容而不是再次请求?
- 为什么 WebView 在第一个请求上不使用 Http HEAD 方法而不是 GET? (我想这将使每个超链接成为一个两步过程,而且这也会很昂贵)
- 有什么办法可以阻止额外的下载吗?也许使用 shouldOverrideUrlLoading() 来拦截请求?
初学者最好能得到你的答案3.问题:
我认为 WebView 对所有资源都使用 GET 方法。并且只有在获取此请求的第一个 http 标头之后,WebView 才会检查是否有标头告诉“下载”
(例如像这样的标题Content-Disposition: Attachment; filename=example.html
)
如果不存在指向下载的标头,WebView 将在其视图中显示负载和内容。
onDownload
如果存在下载标头(即使其值设置为“内联”),则调用。
回答问题2:
我认为在这种情况下,网络视图不会加载内容的内容。
目前我不知道如何重用现有请求。
回答问题4
如果你覆盖shouldInterceptRequest
就像这个例子一样:https://stackoverflow.com/a/29811280/2377961你可以改变这种行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)