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

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

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

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

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

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

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

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

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

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

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

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