2014-09-04 36 views
24

Ho una visualizzazione Web nel mio layout. Per impostazione predefinita, viene aperto un modulo di ricerca. Alla ricerca, una sezione di elenco appare sotto il modulo di ricerca. Se si fa clic su un collegamento nell'elenco, viene aperta la pagina dei dettagli. Ora voglio controllare la navigazione posteriore per la webview. Ho inserito questo codice in Attività.Android 4.4 errore di ERR_CACHE_MISS in onReceivedError per WebView indietro

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

} 

Ho anche impostato un WebViewClient con WebView. Quando torno usando il pulsante indietro, funziona bene per qualsiasi versione 4.4. Ma quando sto provando in Android 4.4, sta tornando bene dalla pagina dei dettagli alla pagina di elenco. Ma non appena cerco di tornare indietro, il suo codice errore di lancio -1 e ERR_CACHE_MISS nella descrizione. Nessuna pagina è visualizzata.

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

Come risolvere questo problema in Android 4.4?

risposta

56

Questo errore deriva in realtà dall'esterno dell'applicazione nella maggior parte dei casi (a volte manca solo il permesso INTERNET, ma non sembra il caso qui).

Stavo scrivendo una spiegazione, ma ho trovato un esempio molto più diretto che funge anche da spiegazione in this answer to another question. Ecco i bit rilevanti, ri-hashed un po ':

  1. Joe attraverso il formulario d'ordine con la sua carta di credito
  2. I processi server che le informazioni e restituisce una pagina di conferma/ricevuta che è contrassegnato con no-cache nell'intestazione , il che significa che sarà sempre richiesto dal server.
  3. Joe va a un'altra pagina.
  4. Joe fa clic indietro perché vuole ricontrollare qualcosa, portandolo alla pagina di conferma.

Il problema sorge da quest'ultimo passaggio. La pagina di conferma è stata contrassegnata con no-cache, quindi deve essere richiesta nuovamente dal server. Ma per mostrare correttamente la stessa pagina, gli stessi dati che sono stati passati la prima volta devono essere inviati di nuovo.

Ciò comporta che Joe riceve due volte la fatturazione, poiché viene eseguita una nuova richiesta con le stesse informazioni dell'ultima volta. Joe non sarà un campeggiatore felice quando troverà due accuse sul suo conto e un paio di tende in più sulla soglia di casa sua.

Sembra che questa situazione fosse abbastanza comune che ora è un errore standard nella maggior parte dei browser e, apparentemente, nelle versioni più recenti di Android. L'errore proviene effettivamente da Chromium, motivo per cui vedrai lo stesso errore in Google Chrome e perché lo vedi solo in 4.4 (che ha introdotto una nuova versione di WebView based on Chromium).

In effetti, probabilmente lo hai già visto prima, è il messaggio che compare nella maggior parte dei browser che ti avvisa con qualcosa sulla falsariga di "Per aggiornare questa pagina, il browser dovrà reinviare i dati ... yada yada bla".

Questo è il modo in cui Android 4.4 ti avvisa di cosa sta succedendo. Come risolverlo dipende molto da cosa ti stai connettendo, ma se cerchi questa situazione, scoprirai che è abbastanza comune e ha delle correzioni. L'esatto trigger dell'errore è in realtà quando la richiesta non può essere riparata dalla cache (in questo caso, no-cache sta causando ciò).

A seconda della natura della richiesta, forse no-cache non è effettivamente necessario.

Ma dal punto di vista dell'applicazione, il problema principale è, onReceiveError è una sorta di "ultima risorsa" per la WebView. Gli errori che hai ottenuto si sono propagati dal sistema sottostante. E una volta che finisci lì, non puoi continuare il caricamento della pagina dato che si trova. Quindi non hai la possibilità di autorizzare il reinvio e non puoi concedere all'utente tale opzione, a differenza di Google Chrome.

10

Usa

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

Si risolverà ERR_CACHE_MISS in WebView. Forse dovresti cambiarlo in SDK_INT == 19 dopo alcuni aggiornamenti di Lollipop WebView, ma per ora funziona.

+0

funziona perfettamente con me – craigrs84

+1

Ho finito per utilizzare LOAD_NO_CACHE anziché LOAD_CACHE_ELSE_NETWORK. Lo stesso concetto, ma LOAD_CACHE_ELSE_NETWORK dice che usa le risorse memorizzate nella cache anche se sono scadute e non mi sembravano buone. – craigrs84

27

Ho incontrato lo stesso problema, perché nella mia cartella manifesta ho avuto il permesso di Internet in maiuscolo:

ho avuto (errore)

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

dovrebbe avere (nessun errore)

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

rimuove il messaggio di errore, ma questo è strano in quanto il completamento automatico in Studio utilizza UC come il primo esempio. –

+0

Lo stesso qui, comportamento molto strano di Studio. – wzieba

0

questa autorizzazione nel file andriodManifest.xml

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