2012-08-09 18 views
24

Estoy desarrollando una aplicación para Android que carga una página web en un WebView, pero a veces el sitio web devuelve código HTTP 500.HTTP GET Código de estado en WebView Android

Mi pregunta es: ¿hay alguna manera de conseguir el HTTP código de estado de un WebView con un oyente o con otra clase ??

Intenté implementar un WebViewClient, pero no pude obtener el código de estado HTTP que recibió WebView.

Respuesta

1

No creo que sea posible obtener código de estado de manera sencilla (si es posible) desde webView.

Mi idea es utilizar el método de WebViewClient onReceivedError() (como se ha dicho) con errores definidos en WebViewClient (la lista completa de errores está disponible aquí: http://developer.android.com/reference/android/webkit/WebViewClient.html) y se supone que para el código de estado 504 instancia es igual a WebViewClient.ERROR_TIMEOUT etc.

+0

Gracias, pero es que no funciona, puedo aplicar ese método, pero la vista web no provocó la misma. Lo intentaré de otra manera y si tengo éxito, publicaré la solución aquí para todos. – Vistiyos

+0

¿Ha llamado a setWebViewClient() en el objeto WebView? Por favor pegue su código. – Mike

+0

'clase pública se extiende EnlaceWebClient WebViewClient { \t \t pública onReceivedError vacío (vista WebView, int errorCode, descripción String, String failingUrl) { \t \t Log.d ("ERROR", "Código de error:" + Integer.toString (código de error)); \t} \t } ' – Vistiyos

13

No es posible (en el momento en que estoy escribiendo esto). La documentación para onReceiveError() son ambiguos en el mejor, pero nos fijamos en este tema,

http://code.google.com/p/android/issues/detail?id=968

Está claro que los códigos de estado HTTP no se informarán a través de ese mecanismo. Cómo es posible que los desarrolladores escribieran WebView sin forma de recuperar el código de estado HTTP realmente me deja boquiabierto.

+0

también, ver esto: http://code.google.com/p/android/issues/detail?id=36633&thanks=36633&ts=1345742278 –

+3

A partir del SDK de 23, esto ya no es el caso. –

1

En este momento no se puede obtener normal HTTP código de respuesta.

Pero como solución, si es posible modificar lado del servidor de aplicación web, utilizar lo siguiente:

En el servidor de crear algún función de JavaScript, digamos, riseHttpError.

En el lado de Android use JavaScript interfaz y cuando necesite decirle a Android que maneje el error HTTP, simplemente llame al Android.riseHttpError() en el servidor.

Android se encargará de esta función y podrá realizar las acciones necesarias en el lado de Android.

En mi solución fueron necesarios para obtener errores. Puede enviar cualquier código que desee. :)

Por supuesto, esta es solo otra variación de cómo hacerlo. Entonces, probablemente haya otros, soluciones mucho mejores.

Pero si puede modificar el lado del servidor, creo que será mejor hacer una solicitud doble usando URLHandler.

12

Puede cargar contenido con ajax y luego simplemente ponerlo en la vista web con loadDataWithBaseURL.

crear una página web como este objeto java

<script type="text/javascript"> 
    function loadWithAjax() { 
     var httpRequest = new XMLHttpRequest(); 
     var path = 'PATH'; 
     var host = 'HOST'; 
     var url = 'URL'; 

     httpRequest.onreadystatechange = function(){ 
      if (httpRequest.readyState === 4) { 
       if (httpRequest.status === 200) { 
        browserObject.onAjaxSuccess(host, url, httpRequest.responseText); 
       } else { 
        browserObject.onAjaxError(host, url, httpRequest.status); 
       } 
      } 
     }; 

     httpRequest.open('GET', path, true); 
     httpRequest.send(null); 
    } 
</script> 
<body onload="loadWithAjax()"> 

BrowserObject es inyectado en Javascript.

addJavascriptInterface(this, "browserObject"); 

Y cárguela en webView. Debe reemplazar path/url con sus valores.

ajaxHtml = IOUtils.toString(getContext().getAssets().open("web/ajax.html")); 
      ajaxHtml = ajaxHtml.replace("PATH", path); 
      ajaxHtml = ajaxHtml.replace("URL", url); 
      ajaxHtml = ajaxHtml.replace("HOST", host); 

loadDataWithBaseURL(host, ajaxHtmlFinal, "text/html", null, null); 

Entonces manejar onAjaxSuccess/onAjaxError así:

public void onAjaxSuccess(final String host, final String url, final String html) 
    { 
     ((Activity) getContext()).runOnUiThread(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       loadDataWithBaseURL(url, html, "text/html", null, null); 
      } 
     }); 
    } 

    public void onAjaxError(final String host, final String url, final int errorCode) 
    { 

    } 

Ahora usted puede manejar los errores HTTP.

+0

Su sugerencia se ve muy bien cuando el desarrollador de la aplicación también puede modificar el sitio web en cuestión, pero ¿qué sucede si el desarrollador de la aplicación no tiene control de HTML/Javascript del sitio web? ¿Dónde colocas ese 'loadWithAjax()'? Gracias. –

+0

buena solución. Gracias. –

3

En realidad, no es una pena comprobar el estado HTTP para ver si el contenido está disponible para cargar en una vista web. Asumido: ya ha configurado su vista web y usted tiene la secuencia para su URL de destino entonces ...

AsyncTask<Void, Void, Void> checkURL = new AsyncTask<Void, Void, Void>() { 
     @Override 
     protected void onPreExecute() { 
      pd = new ProgressDialog(WebActivity.this, R.style.DickeysPDTheme); 
      pd.setTitle(""); 
      pd.setMessage("Loading..."); 
      pd.setCancelable(false); 
      pd.setIndeterminate(true); 

      pd.show(); 
     } 
     @Override 
     protected Void doInBackground(Void... arg0) { 
      // TODO Auto-generated method stub 
      int iHTTPStatus; 

      // Making HTTP request 
      try { 
       // defaultHttpClient 
       DefaultHttpClient httpClient = new DefaultHttpClient(); 
       HttpGet httpRequest = new HttpGet(sTargetURL); 

       HttpResponse httpResponse = httpClient.execute(httpRequest); 
       iHTTPStatus = httpResponse.getStatusLine().getStatusCode(); 
       if(iHTTPStatus != 200) { 
        // Serve a local page instead... 
        wv.loadUrl("file:///android_asset/index.html"); 
       } 
       else { 

        wv.loadUrl(sTargetURL);  // Status = 200 so we can loard our desired URL 
       } 

      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
       // Show a toast for now... 
       Toast.makeText(WebActivity.this, "UNSUPPORTED ENCODING EXCEPTION", Toast.LENGTH_LONG).show(); 
      } catch (ClientProtocolException e) { 
       e.printStackTrace(); 
       // Show a toast for now... 
       Toast.makeText(WebActivity.this, "CLIENT PROTOCOL EXCEPTION", Toast.LENGTH_LONG).show(); 

      } catch (IOException e) { 
       e.printStackTrace(); 
       // Show a toast for now... 
       Toast.makeText(WebActivity.this, "I/O EXCEPTION", Toast.LENGTH_LONG).show(); 

      } catch (Exception e) { 
       e.printStackTrace(); 
       // Show a toast for now... 
       Toast.makeText(WebActivity.this, "GENERIC EXCEPTION", Toast.LENGTH_LONG).show(); 

      } 

      return null; 
     } 


    }; 

    checkURL.execute((Void[])null); 

otra parte, en WebViewClient, cerrar el diálogo

@Override 
    public void onPageFinished(WebView view, String url) 
    { 
     // Do necessary things onPageFinished 
     if (pd!=null) { 
      pd.dismiss(); 
     } 

    }  
+2

¿No estamos cargando la página dos veces en ese caso? –

3

progreso Parece como si este es posible a través de una nueva devolución de llamada en la API M de Android (https://code.google.com/p/android/issues/detail?id=82069#c7).

vacío (vista WebView, solicitud WebResourceRequest, WebResourceResponse ErrorResponse) onReceivedHttpError

Desafortunadamente, esto es muy probable que no está disponible en dispositivos Android pre-M.

-1

Debe utilizar 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(); 
} 
Cuestiones relacionadas