2011-03-25 20 views
7

hi
En una vista de lista tengo una vista web que debe cargar un archivo de imagen desde el servidor, cuando no hay una imagen actual que necesito una imagen ficticia .I tratóAndroid WebViewClient onReceivedError no está llamado a un error 404

holder.image.setWebViewClient(new WebViewClient() 
{ 
        @Override 
       public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) 
       { 

        System.out.println("description error" + description); 
        view.setVisibility(View.GONE); 

       } 

       @Override 
       public void onPageFinished(WebView view, String url) { 

        view.setVisibility(View.VISIBLE); 


       } 


    }); 

tengo unas vistas web con una imagen ficticia en un FrameLayout, oyente onPageFinished se llamará después de cargar todos los URL de la imagen, pero no onReceivedError se llama para una dirección URL que producen una error.Any 404 adivinar cómo hacerlo.

+0

No se puede hacer con WebView, que sin embargo puede utilizar el HTTPClient básica y comprobar si el código de respuesta. Aquí hay un enlace sobre cómo hacer eso: http://stackoverflow.com/questions/2592843/android-how-get-the-status-code-of-an-httpclient-request – Machine

+0

Parece que no se puede hacer : http://stackoverflow.com/questions/5124052/android-webviewclient-onerrorreceived-not-being-called-when-there-is-a-404 –

+0

Intenté usar HttpClient y al verificar el HttpStatus he cargado la url si el mensaje de error de retorno HttpStatus luego impidió que se cargue la url, en su lugar muestra una imagen no png. Si este método es engorroso, ¿alguien puede sugerir una alternativa para esto? – ganesh

Respuesta

0

Ese código parece correcto; ¿Es posible que tu página no esté generando un error 404?

0
holder.image.setWebViewClient(new WebViewClient() { 

    boolean bReceivedError = false; 

    @Override 
    public void onReceivedError(WebView view, int errorCode, 
           String description, String failingUrl) { 
     bReceivedError = true; 
     view.setVisibility(View.GONE); 
    } 

    @Override 
    public void onPageFinished(WebView view, String url) { 
     if(!bReceivedError) 
     view.setVisibility(View.VISIBLE); 
    } 
    }); 
0

@Neeraj está en el camino correcto, pero mi aplicación permite una actualización de la vista web, por lo que es necesario para borrar el estado de error antes de cualquier nueva carga URL. Además, el indicador de error debe almacenarse como un miembro de datos en la actividad padre para que persista durante onPageStart() y onPageFinish(); esos métodos se pueden llamar después de onError().

public class MyActivity extends Activity { 
    private boolean isError; 
    ... 
    protected void onResume() { 
     super.onResume(); 
     isError = false; 
     myWebView.loadUrl(myUrl); 
    } 

    public class MyWebViewClient extends WebViewClient { 
    /** 
    * can be called even after error (embedded images?), so error flag must keep state as data-member in activity, cleared by activity before each loadUrl();   
    */ 
     @Override 
     public void onPageFinished(WebView view, String url) { 
     if (!isError) 
      showContent(); 
     } 

     @Override 
     public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
     isError = true; 
     showError(); 
     } 
3

que tenían el mismo problema hoy en día,

El problema: onPageFinished se llama siempre. Si hay un error, se llamará después de onErrorReceived.

Esta es la solución que he encontrado:

holder.image.setWebViewClient(new WebViewClient() { 

    private boolean error; 

    @Override 
    public void onPageStarted(WebView view, String url, Bitmap favicon) { 

     super.onPageStarted(view, url, favicon); 
     error = false; 
    } 

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

     error = true; 
     System.out.println("description error" + description); 
     view.setVisibility(View.GONE); 
    } 

    @Override 
    public void onPageFinished(WebView view, String url) { 

     if (!error) { 
      view.setVisibility(View.VISIBLE); 
     } 
     error = false; 
    } 

}); 
3

tuve que anular WebViewClient.onReceivedHttpError() en lugar de WebViewClient.onReceivedError().

@Override 
    public void onReceivedHttpError(final WebView view, final WebResourceRequest request, WebResourceResponse errorResponse) { 
     final int statusCode; 
     // SDK < 21 does not provide statusCode 
     if (Build.VERSION.SDK_INT < 21) { 
      statusCode = STATUS_CODE_UNKNOWN; 
     } else { 
      statusCode = errorResponse.getStatusCode(); 
     } 

     Log().d(LOG_TAG, "[onReceivedHttpError]" + statusCode); 
    } 

De la documentación cliente Web:

/** 
* Notify the host application that an HTTP error has been received from the server while 
* loading a resource. HTTP errors have status codes &gt;= 400. This callback will be called 
* for any resource (iframe, image, etc), not just for the main page. Thus, it is recommended to 
* perform minimum required work in this callback. Note that the content of the server 
* response may not be provided within the <b>errorResponse</b> parameter. 
* @param view The WebView that is initiating the callback. 
* @param request The originating request. 
* @param errorResponse Information about the error occured. 
*/ 
public void onReceivedHttpError(
     WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { 
} 
+2

onReceivedHttpError no está disponible si el nivel de API <23 – Michael

Cuestiones relacionadas