Apache HttpClient 4.0 falla en el tiempo de espera para socket en Android

Estoy trabajando en una aplicación de Android que requiere el uso de HttpClient para cargar un archivo desde el dispositivo Android a un servidor web. El archivo que estoy cargando puede alcanzar tamaños de hasta 1 Gb y, por lo tanto, los tiempos muertos pueden ocurrir si el dispositivo pierde conexión durante la subida. Lo extraño es que el tiempo de espera que establezco para el socket no parece tener ningún efecto. La aplicación sólo se bloquea cada vez que pierdo conexión en lugar de aumentar la SocketTimeoutException.

He intentado usar:

HttpConnectionParams.setConnectionTimeout(params, CrashLogParams.TIMEOUT); HttpConnectionParams.setSoTimeout(params, CrashLogParams.TIMEOUT); 

Pero esto sólo funcionó para el tiempo de espera de conexión, no el tiempo de espera de socket. También lo intenté:

 HttpParams p = httpclient.getParams(); p.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 10000); p.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000); 

La razón sé que el timeout de la conexión funciona es porque, conseguiría la excepción para el tiempo de espera de la conexión después de ejecutar

 httpclient.execute(httppost); 

La aplicación parece bloquearse cuando la conexión se pierde durante la carga, pero después de que la aplicación ha realizado una conexión con el servidor.

Para probar mi aplicación, deshabilité la red en diferentes momentos para ver cómo reaccionaría la aplicación. Si desactivo la red antes de enviar la solicitud, obtengo un error de conexión y mi aplicación puede manejarlo con gracia, pero si lo deshabilito durante la carga, la aplicación se bloquea. Por supuesto que estoy haciendo todas estas peticiones a través de AsyncTasks, por lo que el hilo principal de la interfaz de usuario no se bloquea. Sólo me estoy preguntando si hay alguna otra manera de asegurarse de que el socket de tiempo de espera al no recibir ningún dato, o si estoy perdiendo nada aquí. He leído muchos blogs y posts, pero la mayoría de ellos sólo sugieren usar SO_TIMEOUT que no funciona para mí.

Sotimeout no funciona en una publicación multipart http en android 2.1

¿Está creando su propio ClientConnectionManager? Echa un vistazo a la fuente de AndroidHttpClient.newInstance () .

Crean un nuevo objeto BasicHttpParams y lo pasan a los constructores tanto para ThreadSafeClientConnectionManager como para DefaultHttpClient. No veo una manera de establecer parámetros en ClientConnectionManager excepto en el constructor.

Estoy enfrentando el mismo problema que tú, con el mismo caso de uso. Sucede en una samsung galaxy s2 android 2.3.6 pero no con el mismo dispositivo en 4.x. Desafortunadamente este es exactamente el dispositivo que mi cliente usa, y funciona muy bien en aproximadamente 10 otros dispositivos de prueba con varias versiones y constructores de Android …

Pasé horas intentando con HttpUrlConnection biblioteca en lugar de HttpClient de Apache, pero el resultado final es el mismo. AndroidHttpClient muestra el mismo comportamiento. Esto me lleva a decir que suena como una implementación de hardware o un problema relacionado con SO …

La única solución que encontré fue poner el método HttpClient.execute() en un subproceso separado y llamar a thread.join(timeout) como una seguridad para detener el subproceso si algo sale mal. El inconveniente es cuando la subida se ejecuta bien, pero tarda más que el tiempo de espera, la solicitud se interrumpe …

Si encontró algo mientras tanto, le agradecería enormemente que pudiera compartirlo.

  • AsyncSocket en java?
  • Socket timeout usando android marshmallow. Android <6 funciona. ¿Ha cambiado algo?
  • No se puede leer socket InputStream en Jelly Bean
  • ¿Cómo se puede forzar una descarga en un objeto OutputStream sin cerrarlo?
  • Socket Android + ObjectOutputStream no funciona correctamente
  • Problema con la conexión Bluetooth de Android
  • Android: ¿Cómo usar Gottox / socket.io-java-cliente de la biblioteca con la forma correcta?
  • Uso incorrecto de BufferedReader
  • Android: transmisión de audio a través de sockets TCP
  • Tecnología para aplicaciones como teamviewer en android
  • Intercambio de datos entre dos dispositivos Android en hotspot
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.