web-dev-qa-db-ja.com

Android 4.4 WebViewのonReceivedErrorでERR_CACHE_MISSエラーを返す

レイアウトにWebビューがあります。デフォルトでは、検索フォームが開かれます。検索時には、検索フォームの下にリストセクションが表示されます。リスト内のリンクをクリックすると、詳細ページが開きます。次に、WebViewのバックナビゲーションを制御します。このコードをActivityに配置しました。

    @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {

            Log.d("TYPE", TYPE);

            WebView myWebView = null;
            if (TYPE.equalsIgnoreCase("REPORT_ACTIVITY"))
                myWebView = reportView;

            if (TYPE.equalsIgnoreCase("FEEDBACK_ACTIVITY"))
                myWebView = feedbackView;

            if (myWebView != null)
                // Check if the key event was the Back button and if there's history
                if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
                    myWebView.goBack();
                    return true;
                }
            // If it wasn't the Back key or there's no web page history, bubble up
            // to the default
            // system behavior (probably exit the activity)
            return super.onKeyDown(keyCode, event);
        }

private WebViewClient webViewClient = new WebViewClient() {
  public void onPageStarted(WebView view, String url, Bitmap favicon) {
            Log.d("onPageStarted", "onPageStarted");
            loadProgressBarBox.setVisibility(View.VISIBLE);
            //view.setVisibility(View.GONE);
        }

        public void onPageFinished(WebView view, String url) {
            Log.d("onPageFinished", "onPageFinished");
            loadProgressBarBox.setVisibility(View.GONE);
        }

        public void onReceivedError(WebView view, int errorCode,
                String description, String failingUrl) {

            Log.d("Error", "Error code: " + errorCode + "/" + description);
       }

}

また、WebViewでWebViewClientを設定しました。戻るボタンを使用して戻ると、バージョン4.4で正常に動作します。しかし、Android 4.4で試してみると、詳細ページからリストページに問題なく戻ってきます。説明にあるページは表示されません。

09-04 06:59:05.666: D/Error(1102): Error code: -1/net::ERR_CACHE_MISS

Android 4.4でこの問題を解決するには?

29
dev_android

このエラーは、実際にはほとんどの場合、アプリケーションの外部から発生します(場合によっては、INTERNET権限が欠落しているだけですが、ここの場合のようには聞こえません)。

私は説明を入力していましたが、 別の質問に対するこの回答 の説明を兼ねたもっと簡単な例を見つけました。少し再ハッシュした関連ビットを次に示します。

  1. ジョーはクレジットカード情報を注文フォームに入力します
  2. サーバーはその情報を処理し、ヘッダーでno-cacheとマークされた確認/受信ページを返します。つまり、常にサーバーから要求されます。
  3. ジョーは別のページに移動します。
  4. ジョーは何かを再確認して、確認ページに移動したいので、クリックします。

問題はその最後のステップから発生します。確認ページにはno-cacheのマークが付いていたため、サーバーから再度要求する必要があります。ただし、同じページを正しく表示するには、最初に渡された同じデータを再度送信する必要があります。

これにより、前回と同じ情報を使用して新しいリクエストが行われているため、Joeは2回請求されます。ジョーは、自分のアカウントで2件の料金を請求し、玄関先で追加のテントを見つけたとき、幸せなキャンピングカーではありません。

この状況は十分に一般的だったようで、現在ではほとんどのブラウザ、および明らかに新しいバージョンのAndroidで標準エラーになっています。このエラーは実際にはChromiumから発生しているため、Google Chromeでも同じエラーが表示され、4.4(WebViewの新しいバージョン Chromiumに基づく )でのみ表示されます。

実際、おそらくあなたは実際にそれを見たことがあるでしょう。ほとんどのブラウザに表示されるメッセージです。「このページを更新するには、ブラウザはデータを再送信する必要があります...ヤダヤダヤダ」という行に沿って警告します。

これはAndroid 4.4が何が起こっているかを警告する方法です。それを修正する方法は実際に接続しているものによって異なりますが、この状況を検索すると、エラーの正確なトリガーは、実際にはリクエストをキャッシュから処理できない場合です(この場合、no-cacheが原因です)。

リクエストの性質によっては、no-cacheは実際には必要ないかもしれません。

しかし、アプリケーションの観点から見ると、主な問題は、onReceiveErrorがWebViewの一種の「最後の手段」であることです。そこに表示されるエラーは、基礎となるシステムから伝播しています。そして、いったん終了すると、ページの読み込みを続行できません、そのままです。したがって、その再送を許可する機会はなく、Google Chromeのように、ユーザーにそのオプションを与えることはできません。

59
Selali Adobor

私のマニフェストフォルダーでは、インターネットアクセス許可が大文字になっていたため、同じ問題に遭遇しました。

ありました(エラー)

<uses-permission Android:name="Android.PERMISSION.INTERNET"/>

あるべき(エラーなし)

<uses-permission Android:name="Android.permission.INTERNET"/>
30
codebyjames

つかいます

if (Build.VERSION.SDK_INT >= 19) {
        mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
    }

WebViewのERR_CACHE_MISSを修正します。 Lollipop WebViewの更新後、SDK_INT == 19に変更する必要があるかもしれませんが、今のところは動作します。

14
romashko_o

andriodManifest.xmlファイルのこの許可

 <uses-permission Android:name="Android.permission.INTERNET"/>
0
saigopi