WebView が Http Get を実行し、完全なファイルをダウンロードしてから、onDownloadStart() メソッドを呼び出し、コードがファイルを再度ダウンロードするというのは本当ですか?
Android アプリケーションで使用される WebView では、PDF ファイルのダウンロードを処理する必要があります。私は理にかなっていると思う動作を見ていますが、奇妙に思えるので、誰かが私のために検証できることを願っています.
WebView が設定されたら、setDownloadListener() を呼び出し、新しい DownloadListener を作成して onDownloadStart() メソッド呼び出しを処理します。onDownloadStart() メソッドでは、HttpURLConnection を使用して Web サーバーからリソースを取得します。
ネットワーク トレースで、同じリソースに対して実行された 2 つの Http Get 要求を確認します。これは、webview が最初にリソースに対して Get を実行し、次に webview が独自の処理を行い、リソースをレンダリングできないと判断したためだと思います。次に、webview が onDownloadStart() メソッドを呼び出し、リソースをもう一度取得します。
SetDownloadListenerのドキュメントには次のように書かれています。
レンダリング エンジンでコンテンツを処理できず、代わりにダウンロードする必要がある場合に使用するインターフェイスを登録します。これにより、現在のハンドラが置き換えられます。
webview は、サーバーからの応答を取得し、返されたコンテンツ タイプを読み取ることができるまで、リソースをレンダリングできるかどうかを認識しません。そのため、最初に GET または HEAD を実行して応答ヘッダーを読み取る必要があります。したがって、二重ダウンロードの動作は理にかなっているようです。
そして、いくつかのフォローアップの質問:
- これは一般的な状況ですか?Webview 内からファイルをダウンロードするほとんどのアプリは、実際にファイルを 2 回ダウンロードしますか? (それは高価に思えますが、私はそれが起こっていると思います)
- 再度リクエストするのではなく、最初のリクエストからダウンロード済みのコンテンツを再利用する方法はありますか?
- WebView が最初の要求で GET ではなく Http HEAD メソッドを使用しないのはなぜですか? (これにより、すべてのハイパーリンクが2段階のプロセスになり、それも費用がかかると思います)
- 余分なダウンロードを防ぐ方法はありますか? おそらく、 shouldOverrideUrlLoading() を使用してリクエストをインターセプトしますか?