web-dev-qa-db-fra.com

Android 4.4 générant une erreur ERR_CACHE_MISS dans onReceivedError for WebView

J'ai une vue Web dans ma mise en page. Par défaut, un formulaire de recherche y est ouvert. Lors de la recherche, une section de liste apparaît sous le formulaire de recherche. Si un lien dans la liste est cliqué, la page de détails s'ouvre. Maintenant, je veux contrôler la navigation arrière pour la vue Web. J'ai placé ce code dans l'activité.

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

}

J'ai également défini un WebViewClient avec WebView. Quand je retourne en utilisant le bouton Précédent, cela fonctionne très bien pour n’importe quelle version 4.4. Mais lorsque j'essaie dans Android 4.4, cela revient bien de la page de détails à la page de liste. Mais dès que j'essaie de revenir en arrière, le code d'erreur de projection -1 et ERR_CACHE_MISS sont décrits. Aucune page n'est affichée.

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

Comment résoudre ce problème dans Android 4.4? 

26
dev_android

Cette erreur provient en réalité de l'extérieur de votre application dans la plupart des cas (il s'agit parfois d'une permission INTERNET manquante, mais cela ne ressemble pas à la cas ici).

J'étais en train de taper une explication, mais j'ai trouvé un exemple beaucoup plus simple qui peut également servir d'explication dans cette réponse à une autre question . Voici les bits pertinents, un peu hachés:

  1. Joe remplit un formulaire de commande avec ses informations de carte de crédit
  2. Le serveur traite ces informations et renvoie une page de confirmation/accusé de réception portant la mention no-cache dans l'en-tête, ce qui signifie qu'elle sera toujours demandée par le serveur.
  3. Joe va à une autre page.
  4. Joe clique en arrière parce qu'il veut revérifier quelque chose et l'amener à la page de confirmation.

Le problème provient de cette dernière étape. La page de confirmation était marquée avec no-cache; elle doit donc être à nouveau demandée par le serveur. Mais pour afficher correctement la même page, les mêmes données qui ont été transmises la première fois doivent être envoyées à nouveau.

Joe se voit facturer deux fois, puisqu’une nouvelle demande est présentée avec les mêmes informations que la dernière fois. Joe ne sera pas un bon campeur quand il trouvera deux charges sur son compte et une paire de tentes supplémentaires à sa porte.

Il semble que cette situation était assez commune pour devenir une erreur standard sur la plupart des navigateurs et, apparemment, sur les nouvelles versions d’Android. L’erreur provient en fait de Chromium, c’est pourquoi vous verrez la même erreur dans Google Chrome et vous ne la voyez que dans la version 4.4 (qui a introduit une nouvelle version de WebView basée sur Chromium ). 

En fait, vous l'avez probablement déjà vu auparavant, c'est le message qui apparaît dans la plupart des navigateurs et qui vous avertit par exemple: "Pour actualiser cette page, le navigateur doit renvoyer les données ... yada yada yada".

C'est la façon dont Android 4.4 vous avertit de ce qui se passe. Comment résoudre ce problème dépend vraiment de la connexion à laquelle vous vous connectez, mais si vous recherchez cette situation, vous constaterez que c'est assez courant et que des correctifs sont apportés. Le déclencheur exact de l'erreur est en réalité lorsque la demande ne peut pas être traitée à partir du cache (dans ce cas, no-cache est la cause). 

En fonction de la nature de la demande, no-cache n'est peut-être pas nécessaire. 

Mais du point de vue de votre application, le problème principal est que onReceiveError est une sorte de "dernier recours" pour WebView. Les erreurs que vous rencontrez se sont propagées à partir du système sous-jacent. Et une fois que vous y êtes arrivé, vous ne pouvez pas continuer le chargement de la page tel qu’il est. Donc, vous n'avez pas la possibilité d'autoriser ce renvoi, et vous ne pouvez pas donner cette option à l'utilisateur, contrairement à Google Chrome.

57
Selali Adobor

J'ai rencontré le même problème car dans mon dossier manifeste, l'autorisation Internet était en majuscule:

J'ai eu (erreur)

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

Devrait avoir (pas d'erreur)

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

Utilisation 

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

Cela corrigera ERR_CACHE_MISS dans WebView . Vous devrez peut-être le changer en SDK_INT == 19 après certaines mises à jour de Lollipop WebView, mais cela fonctionne pour le moment.

10
romashko_o

cette permission dans votre fichier andriodManifest.xml

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