WebView是否会执行Http获取并下载完整文件然后调用我的onDownloadStart()方法并且我的代码再次下载文件?
在Android应用程序中使用的WebView中,我们需要处理下载PDF文件.我看到了我认为有意义的行为,但看起来很奇怪,所以我希望有人能为我验证.
设置WebView后,我们调用setDownloadListener()并创建一个新的DownloadListener来处理onDownloadStart()方法调用.在onDownloadStart()方法中,我们使用HttpURLConnection从我们的Web服务器获取资源.
在网络跟踪中,我看到为同一资源执行了两个Http Get请求.我假设这是因为webview首先对资源进行了Get,然后webview执行自己的处理并确定它无法呈现资源.然后webview调用onDownloadStart()方法,我们第二次检索资源.
Register the interface to be used when content can not be handled by
the rendering engine, and should be downloaded instead. This will
replace the current handler.
webview不知道它是否可以呈现资源,直到它从服务器获得响应并且可以读取返回的内容类型.因此,它必须首先执行GET或HEAD来读取响应头.因此,双重下载行为似乎是有道理的.
并且,一些跟进问题:
>这是一种常见情况吗?大多数从webview中下载文件的应用程序是否真的下载了两次文件? (这看起来很贵,但我认为可能会发生)
>有没有办法重新使用第一个请求中已下载的内容而不是再次请求它?
>为什么WebView在第一个请求而不是GET上使用Http HEAD方法? (我想这会使每个超链接都是一个两步过程,这也会很昂贵)
>有没有办法阻止额外的下载?也许使用shouldOverrideUrlLoading()来拦截请求?
解决方法:
当你开始回答你的3.问题时,它会更好:
我认为WebView对所有Ressources使用GET方法.只有在获得此请求的第一个http标头后,WebView才会检查是否有标题告诉“执行下载”
(例如Content-Disposition:Attachment; filename = example.html等标题)
如果没有指向下载的标头,WebView将在其视图中显示加载和内容.
如果有下载标题,则调用onDownload(即使其值设置为“inline”).
对问题2的回答:
我认为在这种情况下,webview不会加载内容的内容.
目前我不知道重用现有请求的方法.
回答问题4
如果你覆盖了shouldInterceptRequest
标签:android,android-webview
来源: https://codeday.me/bug/20191006/1859255.html