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

Верно ли, что WebView выполнит Http Get и загрузит полный файл, затем вызовет мой метод onDownloadStart (), и мой код снова загрузит файл?

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

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

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

В документации для SetDownloadListener говорится :

Зарегистрируйте интерфейс, который будет использоваться, когда контент не может обрабатываться механизмом рендеринга и должен быть загружен вместо этого. Это заменит текущий обработчик.

Веб-просмотр не будет знать, сможет ли он отобразить ресурс, пока не получит ответ от сервера и не сможет прочитать возвращенный тип содержимого. Итак, он должен сначала выполнить GET или HEAD, чтобы прочитать заголовки ответа. Итак, поведение двойной загрузки кажется логичным.

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

  1. Это обычная ситуация? Действительно ли большинство приложений, загружающих файлы из веб-просмотра, загружают файл дважды? (это кажется дорогим, но я думаю, что это может случиться)
  2. Есть ли способ повторно использовать уже загруженный контент из первого запроса, а не запрашивать его снова?
  3. Почему WebView не использует метод Http HEAD при первом запросе, а не GET? (Я думаю, это сделало бы каждую гиперссылку двухэтапным процессом, и это тоже было бы дорого)
  4. Есть ли способ предотвратить дополнительную загрузку? Возможно, использовать shouldOverrideUrlLoading () для перехвата запроса?

person Michael Levy    schedule 21.09.2012    source источник
comment
Другой вопрос с похожей темой недавно не получил принятого ответа (ссылка для справки).   -  person Joe    schedule 26.09.2012
comment
это решило проблему stackoverflow.com/a/65684942/8258305   -  person Mohd Qasim    schedule 12.01.2021


Ответы (1)


Лучше, когда вы начнете с ответа на свой 3. вопрос:

Я думаю, что WebView использует GET-метод для всех ресурсов. И только после того, как он получит первые HTTP-заголовки этого запроса, WebView проверяет, есть ли заголовки, которые говорят «выполнить загрузку».

(например, заголовки типа Content-Disposition: Attachment; filename=example.html)

Если заголовок, указывающий на загрузку, отсутствует, WebView отобразит загрузку и содержимое в своем представлении.

onDownload вызывается, если есть заголовок загрузки (даже если для него установлено значение «inline»).

Ответ на вопрос 2:

Я думаю, что в этом случае веб-просмотр НЕ загружает содержимое контента. В настоящее время я не знаю, как повторно использовать существующий запрос.

Ответ на вопрос 4

Если вы переборщите shouldInterceptRequest

как в этом примере: https://stackoverflow.com/a/29811280/2377961 Вы можете изменить это поведение.

person Radon8472    schedule 25.09.2015