Вызывается ли setDownloadListener onDownloadStart после того, как веб-просмотр уже получает файл?

Is it true that the WebView will perform an Http Get and download the complete file then it calls calls my onDownloadStart() method and my code downloads the file again?

В WebView, используемом в приложении Android, мы должны обрабатывать загрузку PDF-файла. Я вижу поведение, которое, как мне кажется, имеет смысл, но оно кажется странным, поэтому я надеюсь, что кто-то может проверить для меня.

Когда WebView настроен, мы вызываем setDownloadListener () и создаем новый DownloadListener для обработки вызова метода onDownloadStart (). В методе onDownloadStart () мы используем HttpURLConnection для получения ресурса с нашего веб-сервера.

В сетевых трассировках я вижу два запроса Http Get, выполненных для одного и того же ресурса. Я предполагаю, что это потому, что веб-просмотр сначала выполняет Get для ресурса, а затем веб-просмотр выполняет свою собственную обработку и определяет, что он не может отобразить ресурс. Затем веб-просмотр вызывает метод onDownloadStart (), и мы получаем ресурс во второй раз.

Документы дляSetDownloadListener сказать:

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, чтобы прочитать заголовки ответа. Таким образом, поведение двойной загрузки имеет смысл.

И некоторые последующие вопросы:

Is this a common situation? Do most apps that download files from within a webview really download the file twice? (that seems expensive but I think it may be happening) Is there a way to reuse the already downloaded content from the first request rather than requesting it again? Why doesn't the WebView use the Http HEAD method on the first request rather than GET? (I guess this would make every hyperlink a two step process and that would be expensive too) Is there a way I can prevent the extra download? Perhaps using shouldOverrideUrlLoading() to intercept the request?

Ответы на вопрос(1)

Ваш ответ на вопрос