2011-08-22 12 views
6

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

+0

¿Ha funcionado su aplicación con archivos de menor tamaño? – momo

+0

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. –

+0

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

Respuesta

0

¿Va a crear su propio ClientConnectionManager? Eche un vistazo a source para AndroidHttpClient.newInstance().

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

+1

Sí, extiendo DefaultHttpClient para crear mi propio HttpClient que habilite SSL. La clase extendida reemplaza a createClientConnectionManager() y establece HttpParams como usted indicó. El código que enumeré fue capaz de establecer el tiempo de espera de la conexión correctamente porque cuando aumentaba el tiempo de espera, también aumentaba el tiempo que tenía que esperar hasta que se generaba una excepción. El único problema es que el tiempo de espera del socket nunca se incrementa sin importar los valores que intento. –

0

Estoy enfrentando el mismo problema que usted, con el mismo caso de uso. Sucede en un Samsung Galaxy S2 que ejecuta Android 2.3.6 pero no con el mismo dispositivo en 4.x. Desafortunadamente este es exactamente el dispositivo que usa mi cliente, y funciona bien en aproximadamente 10 otros dispositivos de prueba con varias versiones y constructores de Android ...

Pasé horas intentando con la biblioteca HttpUrlConnection en lugar de HttpClient desde 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 problema relacionado con el sistema operativo ...

La única solución que encontré fue a poner el método HttpClient.execute() en un hilo separado y llamar a thread.join(timeout) como una garantía para detener el hilo si nada va mal. El inconveniente es que cuando la carga funciona bien pero tarda más que el tiempo de espera, la solicitud se interrumpe ...

Si encontraste algo mientras tanto, agradecería mucho que pudieras compartirlo.

Cuestiones relacionadas