Httpurlconnection es muy lento en Android 4.2
Puedo conectar con éxito, enviar y recibir datos usando httpurlconnection. Pero se tarda mucho tiempo en cargar todos los datos en mi teléfono (Samsung s4, 4.2) y en el android 4.2 emulador. Pero se tarda casi 1-2 segundos (que es muy rápido) para cargar imágenes en Android 2.3.x emulador. Más rápido que mi galaxia s4 en la conexión http.
Estoy utilizando AsyncTask y mi código funciona bien en ambos. Es sólo lento en android 4.2s. He intentado eliminar chunkedStreaming, mantener vivo, cambiar los valores de tiempo de espera, etc, pero aún no éxito
- HttpURLConnection funcionó bien en Android 2.x pero NO en 4.1: no se encontraron desafíos de autenticación
- Longitud de chunk predeterminada de Android HttpURLConnection.setChunkedStreamingMode ()?
- HttpURLConnection falla en Android
- Cómo manejar las cookies en httpUrlConnection usando cookieManager
- HttpUrlConnection getOutputStream lanza IOException
Aquí está mi código
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod("POST"); urlConnection.setDoOutput(true); urlConnection.setDoInput(true); urlConnection.setUseCaches(false); urlConnection.setChunkedStreamingMode(0); urlConnection.setRequestProperty("Connection", "Keep-Alive"); urlConnection.setConnectTimeout(6000); urlConnection.setReadTimeout(6000); urlConnection.setRequestProperty("Content-Type", "multipart/form-data;charset=UTF-8;boundary="+boundary); urlConnection.connect();
¿Hay alguna diferencia entre httpurlconnections de 4.2 y 2.3.x? Que esta mal aqui
¡ACTUALIZAR!
He probado utilizando Log.e () para ver qué línea toma más tiempo.
///// other staff ////...... Log.e("HTTP","3"); if (isCancelled()) return (null); // don't forget to terminate this method Log.e("HTTP","3"); //Output DataOutputStream outputStream = new DataOutputStream( urlConnection.getOutputStream() ); //Send Passcode Log.e("HTTP","4");
Entre 3 y 4, pasa 5-6 segundos en la línea
DataOutputStream outputStream = new DataOutputStream( urlConnection.getOutputStream() );
¡¡ACTUALIZAR!!
Ese tiempo de espera (véase la actualización anterior) está relacionado con urlConnection.setConnectTimeout (6000);
Cuando hago Timeout 1000, entonces las respuestas de la conexión rápidamente (esperar 1 segundo para la línea)
DataOutputStream outputStream = new DataOutputStream( urlConnection.getOutputStream() );
No sé por qué está pasando esto
- Android HTTPUrlConnection: cómo establecer los datos de la entrada en el cuerpo de http?
- Envío de archivos mediante POST con HttpURLConnection
- No se puede obtener el archivo PDF como datos binarios
- Diferencia entre URL.openConnection () y URLConnection.connect ()?
- Android: HttpsUrlConnection con autenticador para la autenticación básica itera siempre cuando la contraseña es incorrecta (en la respuesta 401)
- ¿Cómo se persisten las cookies cuando se utiliza HTTPUrlConnection?
- ¿Qué devuelve el método getResponseMessage () de HttpURLConnection?
- Android Http url conexión Lanzar archivo no encontrado Excepción en getInputstream
Establezca urlConnection.setConnectTimeout () en un tiempo de espera inferior.
La documentación de clase para URLConnection.setConnectTimeout () dice:
Establece el tiempo máximo en milisegundos para esperar mientras se conecta. La conexión a un servidor fallará con SocketTimeoutException si el tiempo de espera transcurre antes de que se establezca una conexión. El valor predeterminado de 0 nos obliga a realizar una conexión de bloqueo. Esto no significa que nunca vamos a tiempo, pero probablemente significa que obtendrá un tiempo de espera TCP después de varios minutos.
Advertencia: si el nombre de host se resuelve a varias direcciones IP, este cliente intentará cada uno en la orden RFC 3484. Si se produce un error en la conexión a cada una de estas direcciones, transcurren varios tiempos de espera antes de que el intento de conexión arroje una excepción. Los nombres de host que admiten IPv6 e IPv4 siempre tienen al menos 2 direcciones IP.
Originalmente tenía el mío establecido en urlConnection.setConnectTimeout(30000);
Y luego lo cambió a urlConnection.setConnectTimeout(1000)
. Inmediatamente, vi resultados más rápidos.
¡Espero que esto ayude!
Usted mencionó que está utilizando AsyncTask
, ¿está tratando de ejecutar varias tareas al mismo tiempo?
Si ese es el caso, debe tener en cuenta que a partir de Android 4.0, AsyncTasks
se serializan de forma predeterminada. Eso significa que el ejecutor ejecutará una tarea a la vez .
Si desea conservar el comportamiento anterior, puede utilizar la siguiente construcción:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } else { myTask.execute(); }
Vea esta entrada del blog para más información:
http://commonsware.com/blog/2012/04/20/asynctask-threading-regression-confirmed.html