4

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 を実行して応答ヘッダーを読み取る必要があります。したがって、二重ダウンロードの動作は理にかなっているようです。

そして、いくつかのフォローアップの質問:

  1. これは一般的な状況ですか?Webview 内からファイルをダウンロードするほとんどのアプリは、実際にファイルを 2 回ダウンロードしますか? (それは高価に思えますが、私はそれが起こっていると思います)
  2. 再度リクエストするのではなく、最初のリクエストからダウンロード済みのコンテンツを再利用する方法はありますか?
  3. WebView が最初の要求で GET ではなく Http HEAD メソッドを使用しないのはなぜですか? (これにより、すべてのハイパーリンクが2段階のプロセスになり、それも費用がかかると思います)
  4. 余分なダウンロードを防ぐ方法はありますか? おそらく、 shouldOverrideUrlLoading() を使用してリクエストをインターセプトしますか?
4

1 に答える 1

2

3. 質問への回答から始めるとよいでしょう。

WebView はすべてのリソースに対して GET メソッドを使用していると思います。そして、このリクエストの最初の http ヘッダーを取得した後でのみ、WebView は「ダウンロードを行う」ことを伝えるヘッダーがあるかどうかを確認します

(例: のようなヘッダーContent-Disposition: Attachment; filename=example.html)

ダウンロードを指すヘッダーが存在しない場合、WebView はそのビューに負荷とコンテンツを表示します。

onDownloadダウンロード ヘッダーがある場合 (その値が "inline" に設定されている場合でも) が呼び出されます。

質問 2 への回答:

その場合、webview はコンテンツのコンテンツをロードしないと思います。現在、既存のリクエストを再利用する方法がわかりません。

質問 4 への回答

オーバーライドするとshouldInterceptRequest

この例のように: https://stackoverflow.com/a/29811280/2377961 この動作を変更できます。

于 2015-09-25T14:52:10.560 に答える