2014-09-04 5 views
24

Ich habe ein Webview in meinem Layout. Standardmäßig ist darin ein Suchformular geöffnet. Bei der Suche erscheint unter dem Suchformular ein Listenbereich. Wenn auf einen Link in der Liste geklickt wird, wird die Detailseite geöffnet. Jetzt möchte ich die Rückwärtsnavigation für die Webansicht steuern. Ich habe diesen Code in Aktivität eingefügt.Android 4.4 gibt ERR_CACHE_MISS Fehler in onReceivedError für WebView zurück

@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 festgelegt. Wenn ich mit der Zurück-Taste zurück gehe, funktioniert es für jede Version 4.4. Aber wenn ich in Android 4.4 versuche, kommt es gut von der Detailseite zur Listenseite zurück. Aber sobald ich versuche, wieder zurück zu gehen, wird der Fehlercode -1 und ERR_CACHE_MISS in der Beschreibung angezeigt. Keine Seite wird angezeigt.

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

Wie löst man dieses Problem in Android 4.4?

Antwort

56

Dieser Fehler stammt eigentlich von außerhalb Ihrer Anwendung in den meisten Fällen (gelegentlich ist es nur eine fehlende INTERNET Erlaubnis, aber das klingt nicht wie hier der Fall).

Ich tippte eine Erklärung, aber fand ein viel einfacheres Beispiel, das als Erklärung in this answer to another question verdoppelt. Hier die entsprechenden Bits ist, Re-gehasht ein wenig:

  1. Joe mit seinen Kreditkarteninformationen in einem Bestellformular füllt
  2. Die Server-Prozesse, die Informationen und gibt eine Bestätigung/Quittung Seite, die mit no-cache in der Kopfzeile markiert ist , dh es wird immer vom Server angefordert.
  3. Joe geht auf eine andere Seite.
  4. Joe klickt zurück, weil er etwas überprüfen möchte und ihn zur Bestätigungsseite bringt.

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

Dies führt dazu, dass Joe zweimal 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 genug war, dass es jetzt ein Standardfehler in den meisten Browsern und scheinbar neueren Android-Versionen ist. Der Fehler stammt tatsächlich von Chromium, weshalb in Google Chrome derselbe Fehler angezeigt wird und Sie ihn nur in Version 4.4 sehen (wodurch eine neue Version von WebView eingeführt wurde based on Chromium).

Tatsächlich haben Sie es wahrscheinlich schon einmal gesehen, es ist die Nachricht, die in den meisten Browsern angezeigt wird, die Sie mit etwas in den Zeilen warnt: "Um diese Seite zu aktualisieren, muss der Browser Daten erneut senden ... yada yada Yada ".

Dies ist Android 4.4 Weg warnt Sie vor, was vor sich geht. Wie Sie es beheben können, hängt davon ab, mit was Sie sich verbinden, aber wenn Sie nach dieser Situation suchen, werden Sie feststellen, dass es ziemlich häufig vorkommt und behoben wurde. Der genaue Auslöser des Fehlers ist tatsächlich, wenn die Anforderung nicht aus dem Cache bedient werden kann (in diesem Fall verursacht no-cache dies).

Abhängig von der Art der Anfrage wird vielleicht no-cache nicht wirklich benötigt.

Aber aus der Sicht Ihrer Anwendung ist das Hauptproblem, onReceiveError ist eine Art "letztes Mittel" für das WebView. Fehler, die Sie dort bekommen haben, haben sich vom darunterliegenden System verbreitet. Und wenn Sie dort oben angekommen sind, können Sie die Seite so fortfahren, wie sie steht. Sie haben also keine Chance, das erneute Senden zu erlauben, und Sie können dem Nutzer diese Option nicht geben, anders als beispielsweise Google Chrome.

10

Verwenden

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

Es wird fix ERR_CACHE_MISS im WebView. Vielleicht müssen Sie es nach einigen Lollipop WebView Updates zu SDK_INT == 19 ändern, aber es funktioniert für jetzt.

+0

das funktioniert gut für mich – craigrs84

+1

Ich endete mit LOAD_NO_CACHE anstelle von LOAD_CACHE_ELSE_NETWORK. Gleiches Konzept, aber LOAD_CACHE_ELSE_NETWORK sagt, dass es zwischengespeicherte Ressourcen verwendet, auch wenn sie abgelaufen sind und das hat sich nicht gut für mich angehört. – craigrs84

27

ich in der gleichen Ausgabe lief, weil in meinem Manifest Ordner ich das Internet Erlaubnis hatte aktiviert:

hatte ich (Fehler)

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

(kein Fehler) haben Sollte

<uses-permission android:name="android.permission.INTERNET"/> 
+0

das entfernt die Fehlermeldung, aber das ist seltsam, da die AutoComplete in Studio UC wie Ihr erstes Beispiel verwendet. –

+0

Das gleiche hier, sehr seltsames Verhalten von Studio. – wzieba

0

Diese Berechtigung in Ihrer andriodManifest.xml-Datei

<uses-permission android:name="android.permission.INTERNET"/> 
Verwandte Themen