2012-02-13 9 views
7

Implementé un servicio de cola en Android que cambiará los estados en función de los eventos de conectividad de colas y wifi/datos.Carga de datos en caché eficazmente en Android

Pongo en cola transacciones que se publicarán en una URL remota. Si el dispositivo tiene una conexión de datos o wifi, repetirá la cola y publicará los datos en la url hasta que la cola esté vacía o haya 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. Sin ralentizar, incluso con miles de transacciones. (Estaba tratando de pellizcarlo un poco)

Enter: baja recepción! Mi aplicación se ralentiza enormemente cuando la recepción 3G es baja. (Sí, toda la carga se produce fuera del hilo de la interfaz de usuario.) Parece que la causa de esta desaceleración tiene que ver con la publicación en el servidor que tarda mucho tiempo en suceder y, a veces, en fallar.

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

+3

Sin duda necesita tener un plan para casos como "la conectividad está ahí, pero el servidor es lento, inalcanzable etC" Dos ideas: 1. persista en la caché, defina un tamaño máximo con el que usted está bien (es decir: cuando es completo no te importa si los eventos son desechados). 2. Mida el tiempo que toma una solicitud. Si el tiempo es mayor que el tiempo que lleva generar eventos, pause por más tiempo para tomar carga de la conexión o el servidor. – vasquez

Respuesta

0

Bueno, si pudiera tener miles de tareas que deben ser ejecutadas, seguramente deberían ser administradas. ¿Has pensado en implementar tu propio ThreadPoolExecutor? La documentación es muy buena y la clase es fácil de entender, pero si necesita ejemplos tratar estos sitios:

La ventaja de esto es que se puede limitar al máximo número de subprocesos que está generando, por lo que no debería disminuir la velocidad de todo el sistema si limita el número de subprocesos a un número razonable (para Android, recomendaría no más de 20).

+0

No estoy ejecutando las cargas en paralelo. En un momento, solo está ocurriendo una carga. Sí, la cola de carga está en un proceso separado de la aplicación "principal", pero aún así, la carga solo se realiza de a uno por vez. ¿Estoy malinterpretando tu sugerencia? – Jonathan

+0

Si solo está ejecutando una tarea a la vez, y la tarea se ejecuta en segundo plano, ¿por qué está ralentizando su UI? ¿O es esa la pregunta del millón? :) –

0

¿Se puede hacer un ajuste fino del socket y el tiempo de espera de la conexión? Por lo tanto, si su conexión es lenta y está estancada, se producirá un tiempo de espera y la transmisión fallará.

Después de que falla la conexión/envío, puede volver a intentar la transmisión más tarde o hacer otra cosa.

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

HttpParams httpParameters = new BasicHttpParams(); 

HttpConnectionParams.setConnectionTimeout(httpParameters, 30 * 1000); 
HttpConnectionParams.setSoTimeout(httpParameters, 15 * 1000); 

HttpClient client = DefaultHttpClient(httpParameters); 
// use client... 
0

Tenemos situación similar para nuestra aplicación. Hemos considerado los problemas de señal como una realidad y que pueden suceder en cualquier momento. Uno de los puntos que seguimos es no eliminar ningún contenido del dispositivo a menos que obtengamos una confirmación funcional del servidor y solo base en el código de estado http. Como en la red lenta o en los casos en que podemos perder la señal repentinamente, mientras que podemos tener publicado nuestro contenido, hubo muchos casos donde los datos se recibieron solo parcialmente. Y entonces decidimos dejar que el servidor supiera el dispositivo de alguna manera [resultado a través de algunas llamadas de solicitud basada en http a través del dispositivo] que se ha recibido el contenido. Más que rendimiento o comprobación de la red, la pregunta que hizo, necesitábamos tal comportamiento para nuestra solidez de la aplicación.

0

Debe consultar usando encabezados de rango HTTP, por ejemplo, como here.

El servidor debe escribir la carga útil en el disco mientras lee y manejar las desconexiones. El cliente no puede saber cuántos bytes de carga realmente alcanzó el servidor, por lo que debe sincronizarse con el servidor cada vez que haya un error de red.No se olvide de manejar los problemas de la batería y el usuario también ;-)

0

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

0

Salida esto: http://www.youtube.com/watch?v=PwC1OlJo5VM#!

avanzada consejos y trucos de codificación, las técnicas de ahorro de ancho de banda, los patrones de ejecución, la exposición a algunas de las características menos conocidas de la API, y una visión de cómo minimizar el consumo de batería, asegurando su la aplicación es un buen ciudadano en la red de operadores.

Cuestiones relacionadas