Caché de forma efectiva las cargas de datos en Android

He implementado un servicio de cola en Android que cambiará estados basados ​​en cola y wifi / eventos de conectividad de datos.

Coloco las transacciones para publicarlas en una url remota. Si el dispositivo tiene una conexión de datos o wifi, itera la cola y publica los datos en la URL hasta que la cola está vacía o hay un evento de desconexión.

Puedo iniciar sesión en mi aplicación, activar el modo avión, generar datos, desactivar el modo avión y publicar la transacción. No ralentizar, incluso con miles de transacciones. (Yo estaba tratando de pish un poco)

Enter: recepción baja! Mi aplicación se ralentiza enormemente cuando la recepción 3G es baja. (Sí, toda la subida sucede fuera del hilo del ui.) Parece que la causa de esta disminución tiene que hacer con el poste al servidor que tarda mucho tiempo para suceder ya veces apenas el fallar.

Mi pregunta es, ¿cómo puedo resolver esto? Compruebe la calidad de la señal? ¿Encuesta una dirección conocida? ¿Cómo solucionan otras aplicaciones, como Gmail? ¡Este debe ser un escenario común!

Bueno, si usted potencialmente podría tener miles de tareas que todos necesitan ser ejecutados, entonces seguramente deben ser gestionados. ¿Ha pensado en implementar su propio ThreadPoolExecutor ? La documentación es muy buena y la clase es fácil de entender, pero si necesita ejemplos pruebe estos sitios:

La ventaja de esto es que puedes limitar el número máximo de subprocesos que estás generando, por lo que no deberías desacelerar todo el sistema si limitas el recuento de hilos a un número razonable (para Android recomendaría no más de 20).

¿Puede ser hacer un ajuste fino de socket y conenction timeout? Por lo tanto, si su conexión es lenta y estancada, se producirá el tiempo de espera y la transmisión fallará.

Después de fallar la conexión / envío, puede reintentar la transmisión más tarde o hacer otra cosa.

Para ajustar tiempos de espera, puede utilizar el código siguiente:

 HttpParams httpParameters = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(httpParameters, 30 * 1000); HttpConnectionParams.setSoTimeout(httpParameters, 15 * 1000); HttpClient client = DefaultHttpClient(httpParameters); // use client... 

Tenemos una situación similar para nuestra aplicación. Hemos considerado las cuestiones de señal como una realidad y una que puede suceder en cualquier momento. Uno de los puntos que seguimos no es quitar ningún contenido del dispositivo a menos que obtengamos una confirmación funcional del servidor y basamos en el código de estado de http. En la red lenta o en los casos en que podemos perder señal de repente, Publicó nuestro contenido, hubo muchos casos en los que los datos se recibieron sólo parcialmente. Y así decidimos dejar que el servidor conozca el dispositivo de alguna manera [resultado a través de algunas llamadas basadas en http de solicitud basadas en dispositivos] que el contenido ha sido recibido. Más que el rendimiento o la comprobación de la red, la pregunta que usted hizo, necesitábamos tal comportamiento para nuestra robustez de la aplicación.

Debe comprobar hacia fuera usando cabeceras del rango del HTTP, por ejemplo como aquí .

El servidor debe escribir carga útil en el disco durante la lectura, y manejar desconecta. El cliente no puede saber cuántos bytes de carga útil realmente alcanzó el servidor, por lo que necesita sincronizar con el servidor cada vez que ha habido un error de red. No se olvide de manejar la batería y los problemas de los usuarios también 😉

Si desea esperar una mejor señal, tal vez la clase SignalStrength , con sus métodos getCdmaDbm, getEvdoDbm y getGsmSignalStrength, es lo que está buscando.

Echa un vistazo a esto: http://www.youtube.com/watch?v=PwC1OlJo5VM#!

Consejos y trucos avanzados de codificación, técnicas de ahorro de ancho de banda, patrones de implementación, exposición a algunas de las características menos conocidas de la API e información sobre cómo minimizar el drenaje de la batería al asegurar que su aplicación sea un buen ciudadano de la red de proveedores.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.