webentwicklung-frage-antwort-db.com.de

Android WebView onReceivedError ()

Weiß jemand, ob es eine Möglichkeit gibt, eine "Seite nicht gefunden" oder einen "Fehler beim Laden der Seite nicht" in WebView abzufangen?

Laut der Dokumentation zu Android) sollte onReceivedError() abfangen können, aber ich habe es in einer App getestet, die ich fälschlicherweise mit der falschen URL angegeben habe, und es hat nichts getan .

Ich möchte, dass meine App meine eigene benutzerdefinierte Fehlermeldung anzeigen kann, wenn die URL aus irgendeinem Grund nicht verfügbar ist.

dies ist der Code, der nichts getan hat:

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

    // custom error handling ... show and alert or toast or something
}
32
Joe Winfield

Laut Dokumentation und meiner Erfahrung sollte es ganz gut funktionieren. Sie müssen nur Ihr WebClient mit der Überschreibungsmethode onReceivedError in Ihrem WebView einstellen.

Hier ist der Ausschnitt aus einer meiner alten Test-Apps:

 WebView wv = (WebView) findViewById(R.id.webView);
 wv.setWebViewClient(new WebViewClient() {
    @Override
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            Log.i("WEB_VIEW_TEST", "error code:" + errorCode);
            super.onReceivedError(view, errorCode, description, failingUrl);
    }
 });

Ich habe es getestet und es funktioniert ganz gut. Überprüfen Sie Ihre Protokolle und stellen Sie fest, welche Art von Codefehler Sie erhalten. Ich hoffe es hilft.

29
androdevo

Ich habe versucht, onReceivedError sowohl innerhalb von shouldOverrideUrlLoading () als auch außerhalb dieser Methode, jedoch im WebViewClient, zu verwenden. Ich habe es sogar draußen in der Hauptaktivität versucht. Ich war mit den widersprüchlichen Ergebnissen nicht zufrieden. Deshalb habe ich mich für eine Testmethode entschieden, isOnline (), und diese aufgerufen, bevor ich loadUrl () aufgerufen habe.

public boolean isOnline() {
    ConnectivityManager cm = (ConnectivityManager) getBaseContext()
            .getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo i = cm.getActiveNetworkInfo();
    if ((i == null) || (!i.isConnected())) {
        Toast toast = Toast.makeText(getBaseContext(),
                "Error: No connection to Internet", Toast.LENGTH_SHORT);
        toast.setGravity(Gravity.TOP | Gravity.CENTER, 0, 0);
        toast.show();
        return false;
    }
    return true;
}

Dann befindet sich dieser onReceivedError im WebViewClient, jedoch außerhalb der Methode overloadurlthingy. Dies scheint konsequent die blöden, grinsenden Android-Fehlerseiten zu verhindern.

    @Override
    public void onReceivedError(WebView view, int errorCode,
            String description, String failingUrl) {
        if (view.canGoBack()) {
            view.goBack();
        }
        Toast toast = Toast.makeText(getBaseContext(), description,
                Toast.LENGTH_SHORT);
        toast.setGravity(Gravity.TOP | Gravity.CENTER, 0, 0);
        toast.show();
    }

Einige Leute halten dies möglicherweise für ressourcenintensiv. Naja, nicht so schwer wie die Android Facebook- und Google+-Apps. Und nicht so wie die Google-Services. Ehrlich gesagt macht es mir nichts aus, ein bisschen Sauerstoff für diese Apps zu verbrauchen. Nenn mich schlecht Junge...

11
R Earle Harris

Sie sollten dies verwenden, nachdem die Seite fertig ist

 @Override
    public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error){
           //Your code to do
        Toast.makeText(getActivity(), "Your Internet Connection May not be active Or " + error , Toast.LENGTH_LONG).show();
    }
2
Harsh Mittal

Denken Sie daran, beide onReceivedError-Methoden zu verwenden, da die Methode mit dem description-Parameter veraltet ist. Wir verwenden diese veraltete Methode für die Unterstützung von API 23. Daher können wir es in allen SDK-Versionen verwenden.

Hier wie ich es mache

   webview.setWebViewClient(new WebViewClient() {


        @SuppressWarnings("deprecation")
        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {

            try {
                webview.stopLoading();
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (webview.canGoBack()) {
                webview.goBack();
            }

            showkError();
        }

        @TargetApi(Android.os.Build.VERSION_CODES.M)
        @Override
        public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {
            // Redirect to deprecated method, so you can use it in all SDK versions
            try {
                webview.stopLoading();
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (webview.canGoBack()) {
                webview.goBack();
            }

            showError();
        }

        @Override
        public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
            super.onReceivedHttpError(view, request, errorResponse);

            try {
                webview.stopLoading();
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (webview.canGoBack()) {
                webview.goBack();
            }

            showError();
        }
  });
0
Smarpit Singh