webentwicklung-frage-antwort-db.com.de

Android 4.4 gibt den Fehler ERR_CACHE_MISS in onReceivedError für WebView zurück

Ich habe eine Webansicht in meinem Layout. Standardmäßig wird ein Suchformular darin geöffnet. Bei der Suche wird ein Auflistungsbereich unter dem Suchformular angezeigt. Wenn auf einen Link in der Liste geklickt wird, wird die Detailseite geöffnet. Nun möchte ich die Rückwärtsnavigation für den Webview steuern. Ich habe diesen Code in Activity eingefügt.

    @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);
       }

}

Ich habe auch einen WebViewClient mit dem WebView eingestellt. Wenn ich mit der Zurück-Taste zurückspringe, funktioniert das für jede Version 4.4. Aber wenn ich es in Android 4.4 probiere, kommt es von der Detailseite zur Listing-Seite. Aber sobald ich versuche, wieder zurückzukehren, wird der Fehlercode -1 und ERR_CACHE_MISS in der Beschreibung angezeigt. Es wird keine Seite angezeigt.

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

Wie löse ich dieses Problem in Android 4.4? 

26
dev_android

Dieser Fehler tritt in den meisten Fällen von außerhalb Ihrer Anwendung auf (gelegentlich ist es nur eine INTERNET-Berechtigung, aber das klingt hier nicht so).

Ich tippte eine Erklärung ein, fand aber ein viel direkteres Beispiel, das als Erklärung in diese Antwort auf eine andere Frage dient. Hier sind die relevanten Bits, die ein wenig erneut gehasht wurden:

  1. Joe füllt ein Bestellformular mit seinen Kreditkarteninformationen aus
  2. Der Server verarbeitet diese Informationen und gibt eine Bestätigungs-/Empfangsseite zurück, die im Header mit no-cache markiert ist. Dies bedeutet, dass sie immer vom Server angefordert wird.
  3. Joe geht zu einer anderen Seite.
  4. Joe klickt zurück, weil er etwas überprüfen möchte, um ihn zur Bestätigungsseite zu bringen.

Das Problem ergibt sich aus diesem letzten Schritt. Die Bestätigungsseite wurde mit no-cache markiert und muss daher erneut vom Server angefordert werden. Um jedoch dieselbe Seite korrekt anzuzeigen, müssen dieselben Daten, die beim ersten Mal übergeben wurden, erneut gesendet werden.

Dies führt dazu, dass Joe zwei Mal in Rechnung gestellt wird, da eine neue Anfrage mit den gleichen Informationen wie beim letzten Mal erfolgt. Joe wird kein glücklicher Camper sein, wenn er zwei Anklagen auf seinem Konto und ein zusätzliches Paar Zelte vor seiner Haustür findet.

Es scheint, dass diese Situation häufig vorkam, so dass es sich bei den meisten Browsern und anscheinend auch bei neueren Android-Versionen um einen Standardfehler handelt. Der Fehler stammt eigentlich von Chromium, weshalb Sie denselben Fehler in Google Chrome sehen und warum Sie ihn nur in 4.4 sehen (was eine neue Version von WebView basierend auf Chromium - eingeführt hat). 

In der Tat haben Sie es wahrscheinlich bereits zuvor gesehen. Diese Meldung wird in den meisten Browsern mit einer Warnung angezeigt, die den folgenden Text enthält: "Um diese Seite zu aktualisieren, muss der Browser Daten erneut senden ... yada yada yada".

Auf diese Weise wird Android 4.4 auf diese Weise gewarnt. Wie Sie das Problem beheben können, hängt wirklich davon ab, mit was Sie sich verbinden. Wenn Sie jedoch nach dieser Situation suchen, werden Sie feststellen, dass dies ziemlich üblich ist und Korrekturen enthalten. Der genaue Auslöser des Fehlers liegt tatsächlich vor, wenn die Anforderung nicht vom Cache bedient werden kann (in diesem Fall verursacht no-cache dies). 

Abhängig von der Art der Anforderung wird no-cache möglicherweise nicht wirklich benötigt. 

Aus Sicht Ihrer Anwendung besteht das Hauptproblem jedoch darin, dass onReceiveError eine Art "letzter Ausweg" für die WebView ist. Fehler, die Sie dort erhalten, haben sich vom zugrunde liegenden System verbreitet. Und wenn Sie dort oben angekommen sind, können Sie das Laden der Seite nicht so fortsetzen, wie es steht. Sie haben also keine Chance, das erneute Senden zuzulassen, und Sie können dem Benutzer diese Option nicht geben, im Gegensatz zu Google Chrome.

57
Selali Adobor

Ich bin auf das gleiche Problem gestoßen, weil ich in meinem Manifestordner die Internet-Berechtigung groß geschrieben hatte:

Ich hatte (fehler)

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

Sollte haben (kein Fehler)

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

Benutzen 

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

Es wird ERR_CACHE_MISS im WebView behoben Möglicherweise müssen Sie es nach einigen Lollipop WebView-Updates in SDK_INT == 19 ändern. Dies funktioniert jedoch vorerst.

10
romashko_o

diese Berechtigung in Ihrer andriodManifest.xml-Datei

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