¿Cómo debo manejar los tiempos de espera del servidor y las respuestas de código de error a una entrada de http en la aplicación para Android?

Mi aplicación para Android publica posts http en URLs como http://example.com/abc.php?email=abc@xyz.com Así que la aplicación para Android básicamente habla con PHP en el lado del servidor y recibe respuestas JSON y las analiza para rellenar varias Vistas de la aplicación. Funciona bien.

Mi pregunta es: ¿Cómo debo manejar los eventos a continuación en la aplicación de Android para que en caso de que estos eventos se produzcan en la aplicación del lado del servidor, la aplicación no debe forzar cerrar como lo hace ahora.

  1. Se produce el tiempo de espera del servidor y no se recibe ninguna respuesta. La aplicación se cierra ahora. Quiero manejar esto apropiadamente.

  2. Códigos de error devueltos como una respuesta a la publicación de la aplicación http al servidor. La App Force se cierra actualmente ya que no he manejado esto.

He encontrado estos dos escenarios donde la aplicación no está codificada para manejar estos eventos. Por favor, siéntete libre de agregar cualquier otro evento que pueda ocurrir que pueda llevar a ANRs a ocurrir en la aplicación para Android.

Un pequeño fragmento de código o pista me ayudará mucho ya que nunca he hecho esto antes.

Gracias.

Sumando a las sugerencias muy buenas hasta ahora …

Mi compañero de trabajo me enseñó a usar las clases del paquete org.apache.http así:

String result = null; HttpGet request = new HttpGet(some_uri); // As Jeff Sharkey does in the android-sky example, // use request.setHeader to optionally set the User-Agent header. HttpParams httpParams = new BasicHttpParams(); int some_reasonable_timeout = (int) (30 * DateUtils.SECOND_IN_MILLIS); HttpConnectionParams.setConnectionTimeout(httpParams, some_reasonable_timeout); HttpConnectionParams.setSoTimeout(httpParams, some_reasonable_timeout); HttpClient client = new DefaultHttpClient(httpParams); try { HttpResponse response = client.execute(request); StatusLine status = response.getStatusLine(); if (status.getStatusCode() == HttpStatus.SC_OK) { ResponseHandler<String> responseHandler = new BasicResponseHandler(); result = responseHandler.handleResponse(response); } else { // Do something else, if wanted. } } catch (ClientProtocolException e) { Log.e(LOG_TAG, "HTTP Error", e); // Do something else, if wanted. } catch (IOException e) { Log.e(LOG_TAG, "Connection Error", e); // Do something else, if wanted. } finally { client.getConnectionManager().shutdown(); } // Further parse result, which may well be JSON. 

Como dijo Kaj en el comentario, una opción es capturar la excepción, y tal vez reintentar o publicar un mensaje de error.

Para los códigos de respuesta! = 200, basta con leerlos y hacer su trabajo dentro de un if (con.getResponseCode() == 200)

Otra opción alternativa, es usar las clases mucho más agradables de Apache:

http://developer.android.com/reference/org/apache/http/package-summary.html

Para obtener un fragmento, compruebe el tutorial de BalusC aquí en SO: Utilizando java.net.URLConnection para disparar y gestionar solicitudes HTTP

También debe asegurarse de que no está realizando tareas largas como las solicitudes HTTP en el subproceso de la interfaz de usuario.

  • Google Cloud Messaging a través del protocolo XMPP (servidor que trabaja con PHP y XMPPHP). ¿Como funciona?
  • Subir imagen de la aplicación PhoneGap Cordova
  • No se puede insertar correctamente caracteres griegos en la base de datos mysql
  • GCM con PHP (Google Cloud Messaging)
  • Android y php
  • Cómo implementar una sencilla API de OAuth y servidor de Android
  • Que cliente es mejor HttpURLConnection o HttpClient en android?
  • PHP + Android XML Encryption / Decryption
  • ¿Cómo puedo hacer que una aplicación de Android se comunique con un servidor web a través de Internet?
  • Cómo hacer un servicio web (preferiblemente usando PHP) que puede ser solicitado para obtener objetos JSON por la aplicación android
  • Envío de datos JSON de Android a PHP y escritura a archivo de texto
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.