2011-02-14 10 views
29

¿Alguien sabe si hay una forma de interceptar una "página no encontrada" o "página sin error de carga" en WebView?Android WebView onReceivedError()

De acuerdo con la documentación de Android, onReceivedError() debería ser capaz de interceptar. pero lo probé en una aplicación que le di erróneamente la URL incorrecta, y no hizo nada.

Quiero que mi aplicación pueda dar mi propio mensaje de error personalizado si la URL alguna vez no está disponible por algún motivo.

este es el código que no hizo nada:

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

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

Respuesta

29

De acuerdo con la documentación y mi experiencia debería funcionar bastante bien. Simplemente tiene que configurar su WebClient con el método onReceivedError modificado en su WebView.

Aquí es el fragmento de una parte de mi aplicación de prueba de edad:

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

Lo he probado y funciona bastante bien. Verifique sus registros y vea qué tipo de error de código obtiene. Espero que ayude.

+0

lo que estoy tratando de hacer es asegurarse de que haga algo más en caso de error, super.onReceivedError (vista, errorCode, description, failingUrl); myWebView.LoadUrl ("www.someOtherSite.net"); pero no hace nada más que darme la página de error "No encontrado". –

+0

¿podría pasar el código de su método onReceivedError? – androdevo

+0

sería demasiado código para esta pequeña ventana. pero utilicé el ejemplo del código que mostraste arriba. –

10

He intentado usar onReceivedError dentro de shouldOverrideUrlLoading() y fuera de ese método, pero en el WebViewClient. Incluso intenté afuera en la clase de Actividad principal. No estaba contento con los resultados inconsistentes. Así que decidí usar un método de prueba, isOnline(), y llamar a eso antes de llamar a loadUrl().

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

Entonces este onReceivedError es en el WebViewClient pero fuera del método overloadurlthingy. Esto parece prevenir sistemáticamente las páginas de error estúpidas y sonrientes de Android.

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

Algunas personas pueden considerar este recurso pesado. Bueno, no pesado como son las aplicaciones de Facebook y Google+ de Android. Y no como son los servicios de Google. Francamente, no me importa usar un poco de esas aplicaciones de oxígeno. Me llaman un chico malo ...

1

que puedes usar esto después de la página terminada en

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