Верно ли, что WebView выполнит Http Get и загрузит полный файл, затем вызовет мой метод onDownloadStart (), и мой код снова загрузит файл?
В WebView, используемом в приложении Android, нам нужно обрабатывать загрузку файла PDF. Я наблюдаю поведение, которое, как мне кажется, имеет смысл, но кажется странным, поэтому я надеюсь, что кто-нибудь сможет проверить за меня.
Когда WebView настроен, мы вызываем setDownloadListener () и создаем новый DownloadListener для обработки вызова метода onDownloadStart (). В методе onDownloadStart () мы используем HttpURLConnection для получения ресурса с нашего веб-сервера.
В трассировке сети я вижу два запроса Http Get, выполненных для одного и того же ресурса. Я предполагаю, что это связано с тем, что веб-просмотр сначала выполняет Get для ресурса, затем веб-просмотр выполняет свою собственную обработку и определяет, что он не может отобразить ресурс. Затем веб-просмотр вызывает метод onDownloadStart (), и мы получаем ресурс во второй раз.
В документации для SetDownloadListener говорится :
Зарегистрируйте интерфейс, который будет использоваться, когда контент не может обрабатываться механизмом рендеринга и должен быть загружен вместо этого. Это заменит текущий обработчик.
Веб-просмотр не будет знать, сможет ли он отобразить ресурс, пока не получит ответ от сервера и не сможет прочитать возвращенный тип содержимого. Итак, он должен сначала выполнить GET или HEAD, чтобы прочитать заголовки ответа. Итак, поведение двойной загрузки кажется логичным.
И еще несколько дополнительных вопросов:
- Это обычная ситуация? Действительно ли большинство приложений, загружающих файлы из веб-просмотра, загружают файл дважды? (это кажется дорогим, но я думаю, что это может случиться)
- Есть ли способ повторно использовать уже загруженный контент из первого запроса, а не запрашивать его снова?
- Почему WebView не использует метод Http HEAD при первом запросе, а не GET? (Я думаю, это сделало бы каждую гиперссылку двухэтапным процессом, и это тоже было бы дорого)
- Есть ли способ предотвратить дополнительную загрузку? Возможно, использовать shouldOverrideUrlLoading () для перехвата запроса?