setDownloadListener在WebView获取文件后被调用吗?

4
WebView会执行Http Get并下载完整文件,然后调用我的onDownloadStart()方法,我的代码会再次下载文件吗?
在Android应用程序中使用的WebView需要处理下载PDF文件。我看到的行为似乎是有道理的,但它似乎很奇怪,所以我希望有人可以验证一下。
当设置了WebView时,我们调用setDownloadListener()并创建一个新的DownloadListener来处理onDownloadStart()方法的调用。在onDownloadStart()方法中,我们使用HttpURLConnection从Web服务器获取资源。
在网络跟踪中,我看到对同一资源执行了两个Http Get请求。我认为这是因为WebView首先对资源进行Get操作,然后WebView进行自己的处理并确定它无法呈现资源。然后WebView调用onDownloadStart()方法,我们第二次检索资源。 SetDownloadListener文档说:
注册在呈现引擎无法处理内容并应下载而不是处理时使用的接口。这将替换当前处理程序。
WebView无法知道它是否可以呈现资源,直到它从服务器获得响应并读取返回的content-type。因此,它必须首先执行GET或HEAD以读取响应标头。因此,双重下载行为似乎是有道理的。
一些后续问题:
1.这是常见情况吗?大多数从WebView下载文件的应用程序真的会下载两次文件吗?(这似乎很昂贵,但我认为它可能发生)
2.是否有一种方法可以重用第一次请求中已经下载的内容,而不是再次请求它?
3.WebView为什么不在第一个请求上使用Http HEAD方法而不是GET?(我想这会使每个超链接成为一个两步过程,这也是昂贵的)
4.是否有一种方法可以防止额外的下载?也许使用shouldOverrideUrlLoading()来拦截请求?

2
最近没有任何被接受的答案(提供参考链接)的另一个类似主题的问题。 - Joe
1
这解决了问题 https://dev59.com/c1HTa4cB1Zd3GeqPOx5V#65684942 - Mohd Qasim
你好。你是怎么解决的?我的意思是如何防止向服务器发送重复请求?我知道需要防止的URL。 - runia
我们从未修复它,只是忍受了双重下载。顺便说一下,这是大约十年前的事情。我不确定这种行为是否仍然存在,或者现在是否有不同的解决方法。 - Michael Levy
1个回答

2

我建议从第三个问题开始回答:

我认为WebView使用GET方法获取所有资源。仅在WebView获取该请求的第一个http头之后,它才会检查是否存在告知“进行下载”的头文件

(例如像Content-Disposition: Attachment; filename=example.html这样的头文件)

如果没有指向下载的标头存在,则WebView将显示并加载视图中的内容。

如果有下载头,则调用onDownload(即使其值设置为“inline”)。

回答问题2:

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

回答问题4:

如果你覆盖了shouldInterceptRequest

如此示例所示:https://dev59.com/3msz5IYBdhLWcg3w3btb#29811280 您可以更改此行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接