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, por lo que pueden producirse tiempos de espera si el dispositivo pierde la conexión durante la carga. Lo extraño es que el tiempo de espera que configuro para el socket no parece tener ningún efecto. La aplicación simplemente se bloquea cuando pierdo la conexión en lugar de aumentar SocketTimeoutException.Apache HttpClient 4.0 no pudo esperar el socket en Android
He intentado utilizar:
HttpConnectionParams.setConnectionTimeout(params, CrashLogParams.TIMEOUT);
HttpConnectionParams.setSoTimeout(params, CrashLogParams.TIMEOUT);
pero esto sólo funcionó durante el tiempo de espera de conexión, no el tiempo de espera de socket. También probé:
HttpParams p = httpclient.getParams();
p.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 10000);
p.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000);
La razón por la que sé que el tiempo de espera de conexión funciona es porque, me gustaría tener la excepción de tiempo de espera de la conexión después de ejecutar
httpclient.execute(httppost);
La aplicación parece bloquearse cuando se pierde la conexión durante la carga , pero después de que la aplicación ha hecho una conexión con éxito al servidor.
Para probar mi aplicación, deshabilité la red en diferentes momentos para ver cómo reaccionaría la aplicación. Si deshabilito la red antes de enviar la solicitud, aparece un error de conexión y mi aplicación puede manejarlo con elegancia, pero si lo desactivo durante la carga, la aplicación se bloquea. Por supuesto, estoy haciendo todas estas solicitudes a través de AsyncTasks, por lo que el subproceso principal de UI no falla. Me pregunto si existe alguna otra forma de garantizar que el socket se agote al no recibir ningún dato, o si me falta algo aquí. He leído muchos blogs y publicaciones, pero la mayoría de ellos solo sugieren usar SO_TIMEOUT que no funciona para mí.
sotimeout not working in a multipart http post on android 2.1
¿Ha funcionado su aplicación con archivos de menor tamaño? – momo
He intentado archivos de 1 mb y el error todavía está allí.Supongo que con archivos más pequeños tendrá más probabilidades de desconectarse en momentos entre las cargas de archivos, pero eso es además del punto. Quiero poder robustecer mi aplicación en caso de fallas de la red. –
Estoy teniendo el mismo problema, excepto que mis tamaños de carga son bastante pequeños, del orden de algunos kb. Todo lo que parece ser necesario para activar el error es que la red se apague después de comprobar si está activa, pero antes de llamar a execute(). – Michael