|
||
|
|
|
|||||||
| Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android |
![]() |
|
|
Herramientas |
|
#1
|
||||
|
||||
|
Como comprobar que una web esta caída.
Me explico, tengo que recoger datos de una web, pero si esta web esta caida... ¿Como lo detecto? Por que se me "peta" la aplicación... tengo la función de si esta conectado el dispositivo a wifi o 3g.. pero claro.. si la web esta caída no se como controlarlo....
A lo mejor con un simple Try... Catch.. es suficiente, pero no se si hay otra forma Saludos ;) Última edición por MixCas Día 31/05/13 a las 22:48:54. Razón: Ya tengo ideas :D SOlucionado :D |
|
|
|
#2
|
||||
|
||||
|
Si la web está caída pueden pasar varias cosas:
- Que el servidor no responda, te saltará un timeout en algún sitio, típicamente a los 30 segundos - Que el servidor no esté disponible o a la web le pase algo, en cuyo caso recibirás mensajes HTTP del tipo 500, 404, etc... todo menos el 200 que es que el recurso está disponible y se va a entregar. - Que la comunicación con el servidor tenga un problema de red, te saltará una IOException Cuando una aplicación "peta" puedes saber perfectamente por qué y hasta qué línea del código es la que ha provocado que se cierre, acostúmbrate a mirar el LogCat. Del try/catch no te libras en cualquier caso, pero también tendrás que ver el código de la respuesta (si es 200 o no)
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
|
| Gracias de parte de: | ||
|
#3
|
||||
|
||||
|
Si estás usando un HttpClient supongo que la respuesta de la web la guardarás en un HttpResponse.
En ese caso, con esto: response.getStatusLine().getStatusCode() Si el valor es distinto de 200, se ha producido un fallo. En el caso de que el servidor no esté disponible se producirá una excepción por cumplirse el TimeOut, en ese caso necesitas el Try Catch (Java ya te obliga a usarlo si usas HttpClient.execute) EDITO: Se adelantó mocelet. |
| Gracias de parte de: | ||
|
#4
|
||||
|
||||
|
Si la web está caída pueden pasar varias cosas:
- Que el servidor no responda, te saltará un timeout en algún sitio, típicamente a los 30 segundos - Que el servidor no esté disponible o a la web le pase algo, en cuyo caso recibirás mensajes HTTP del tipo 500, 404, etc... todo menos el 200 que es que el recurso está disponible y se va a entregar. - Que la comunicación con el servidor tenga un problema de red, te saltará una IOException Cuando una aplicación "peta" puedes saber perfectamente por qué y hasta qué línea del código es la que ha provocado que se cierre, acostúmbrate a mirar el LogCat. Del try/catch no te libras en cualquier caso, pero también tendrás que ver el código de la respuesta (si es 200 o no) ![]() Si estás usando un HttpClient supongo que la respuesta de la web la guardarás en un HttpResponse.
En ese caso, con esto: response.getStatusLine().getStatusCode() Si el valor es distinto de 200, se ha producido un fallo. En el caso de que el servidor no esté disponible se producirá una excepción por cumplirse el TimeOut, en ese caso necesitas el Try Catch (Java ya te obliga a usarlo si usas HttpClient.execute) EDITO: Se adelantó mocelet. ![]() Lo de HttpRequest no lo utilizo, solo me conecto a la web para sacar los datos .xml que es como una API y conozco las rutas jejeje Muchas Gracias chicos!!!! |
|
#5
|
||||
|
||||
|
Que tipo de catch utilizaste para cuando el servidor no está enchufado? He probado con:
catch (ClientProtocolException e) catch (IOException e) Pero no me sigue petando la aplicación... |
|
#6
|
||||
|
||||
|
Pues lo he dejado en la cola de cosas que hacer, pero yo normalmente utilizo catch (Exception e) y no miro exactamente el tipo que son, salvo que me lo pida por defecto algún método... Saludos.
__________________
![]()
|
|
#7
|
||||
|
||||
|
En cuanto a los Exception, yo también uso siempre Exception. Y aunque te lo pida algún método, también puedes quitar todos los que el método te sugiere y dejarlo sólo como Exception. Y por último, es posible que aunque la conexión no se llegue a producir tampoco se produzca la excepción, y el getStatusCode() daría como resultado 0. |
|
#8
|
||||
|
||||
|
Ya se lo he solucionado por privado, era porque no tenía establecidos los Timeout.
En cuanto a los Exception, yo también uso siempre Exception. Y aunque te lo pida algún método, también puedes quitar todos los que el método te sugiere y dejarlo sólo como Exception. Y por último, es posible que aunque la conexión no se llegue a producir tampoco se produzca la excepción, y el getStatusCode() daría como resultado 0. ![]() Gracias de nuevo kriogeN! |
|
#9
|
||||
|
||||
|
Hola,
finalmente como resolvistes el problema ? Yo ahora mismo me encuentro en la misma situación. Mi aplicación hace muchas consultas a un servidor web, y cuando este no responde se queda "colgada" 20 o 30 segundos hasta que recibe el error para tratarlo. 20 - 30 segundos por consulta es excesivo a mi parecer.... |
|
#10
|
||||
|
||||
|
public static int obtenerEstado() {
URI server = null; try { server = new URI("www.tuweb.com/archivo.php"); } catch (URISyntaxException e) { // TODO Auto-generated catch block e.printStackTrace(); } HttpParams params = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(params, 10000); HttpConnectionParams.setSoTimeout(params, 10000); HttpClient httpclient = new DefaultHttpClient(params); HttpGet httpRequest = new HttpGet(server); try { HttpResponse response = httpclient.execute(httpRequest); return response.getStatusLine().getStatusCode(); } catch (ClientProtocolException e) { // TODO Auto-generated catch block Log.e("Catch", "ClientProtocolException"); return -1; } catch (IOException e) { // TODO Auto-generated catch block Log.e("Catch", "IOException"); return -1; } } Yo hice este método, en caso de que salga por un catch devuelvo -1 y ya lo trato donde sea necesario, en caso de ser try, devuelve el statusCode (El que te de el servidor web al que conectes) Con un timeout de 10 segundos, aun así, como comentaba en otro hilo, sigo teniendo un problema, en mi caso, esto se ejecuta en un AsyncTask, y si el servidor está caído o directamente no hay servidor, los 10 segundos del timeout la aplicación se queda congelada a pesar de que, tiene puesto una barra de progreso en el onPreExecute, supongo que será un fallo de Android, pero aquí nadie sabe resolverlo por desgracia ![]() Espero haberte ayudado! |
|
#11
|
||||
|
||||
|
Gracias por responder.
Mi problema estaba que yo no ajustaba los Timeout, ahora dejandolos a 5 segundos es más que suficiente para mi servidor. El tema de que comentas que sigue dando error, yo he echo lo siguiente que igual te sirve. El codigo codigo que me procesa el estado del servidor lo tengo en una clase. Dentro del AsyncTask creo un objeto de esta clase al que le paso como String una URL del servidor que quiero comprobar. Al crearse el objeto almaceno en una variable si el estado del servidor es TRUE o FALSE y lo obtengo con un simple metodo accesor. En mi caso la clase que procesa el estado del servidor trata por igual todos los estados que no sean 202. Yo de esta manera he solucionado los tiempos de carga cuando el servidor no responde, y me funciona perfectamente dentro del AsysncTask. un saludo ! |
![]() |
Estás aquí
|
||||||
|
||||||
| Herramientas | |