He estado viendo dos implementaciones para sincronizar datos entre el servidor y el cliente en la mayoría de las aplicaciones. Esto supone que no se ha configurado GCM: -
Ejecutar periódicamente un servicio de intención que descarga los datos de la red y los almacena en la base de datos.
Implementación de un adaptador de sincronización que se ejecuta periódicamente.
¿Cuál de los anteriores recomendaría tener en su aplicación y por qué?
Nota: los adaptadores de sincronización se ejecutan de forma asíncrona, por lo que debe usarlos con la expectativa de que transfieran datos de manera regular y eficiente, pero no de manera instantánea. Si necesita hacer una transferencia de datos en tiempo real, debe hacerlo en AsyncTask o IntentService. - fuente .
Básicamente, si necesita una transferencia en tiempo real, use IntentService (la primera opción), de lo contrario, SyncAdapter. Sin embargo, prefiero un IntentService porque se siente más personalizable, pero un enfoque más trivial sería usar un SyncAdapter.
Depende en gran medida del tipo de sincronización que necesite.
Periódico
Si su aplicación es una aplicación de noticias que publica publicaciones a una hora determinada todos los días (digamos a las 7.45 a.m. todos los días), entonces ejecuta una tarea periódica en un servicio en segundo plano, digamos a las 8 a.m.
Por ejemplo : Drippler. Me notifican una vez al día (alrededor de las 6.30 p.m.). Creo que usan una tarea periódica.
Evento activado
Si su transferencia de datos se desencadena por la acción del usuario, utilice un servicio en segundo plano o una AsyncTask para la transferencia de datos.
Por ejemplo : DropBox / Evernote. Se sincronizan cuando interactúo con la aplicación.
Instantáneo
Si su aplicación ejecuta mensajería instantánea / correos / actualizaciones importantes no periódicas , entonces necesita notificaciones push, porque desea alertar al usuario de inmediato. Use GCM o Parse para este caso. por ejemplo: WhatsApp / chat de Google. Como mencionó explícitamente que no desea usar GCM, le diré por qué debería usar un proveedor de notificaciones push estándar en lugar de escribir el suyo propio:
Las notificaciones automáticas funcionan instantáneamente: hay muy poco retraso (en el orden de segundos, raramente minutos). Si implementara su propia solución / biblioteca para hacerlo, en un modelo ingenuo, haría ping al servidor cada segundo o 5 segundos o un minuto para verificar el estado. Esto es muy ineficiente ya que consume CPU (y, por lo tanto, batería), ancho de banda en el móvil y carga en su servidor. Sin embargo, en GCM / Parse, siempre mantienen un puerto abierto con el servidor (ver aquí ). Esta es la forma estándar y más eficiente. Además, si 10 aplicaciones usan GCM, no necesita 10 conexiones abiertas, solo necesita una por dispositivo. Y realmente no desea desarrollar su propia solución a menos que tenga una razón / fondos / tiempo válidos para hacerlo.
Una nota sobre el adaptador de sincronización : el adaptador de sincronización funciona bien en los tres casos anteriores. Marque Ejecutar un adaptador de sincronización y verá que depende de GCM o de su propio mecanismo (activación de eventos o solución personalizada) o disponibilidad de red (activación de eventos) o eventos periódicos. Con todo, esta es una buena clase conveniente para sincronizar datos sin tener que hacer una larga lista de inicializaciones cada vez o implementar todos los casos anteriores en un solo lugar.
Como una pregunta extendida, si necesito actualizar los puntajes en vivo de un partido, ¿es el escenario instantáneo el adecuado para este contexto? Tengo una pantalla con detalles de coincidencia y mientras el usuario está en esa pantalla, los puntajes deben actualizarse automáticamente sin sincronización o actualización manual. Entonces, ¿sería gcm el paso correcto por delante?
gaara87
@AkashRamani No veo una razón por la que no deberías usar GCM / Parse para este caso. Sin embargo, GCM es gratis mientras Parse le factura más allá de cierto punto. Si sus actualizaciones están dentro de 4096 bytes, puede enviar la actualización directamente. Si las actualizaciones de su puntaje son muy frecuentes, entonces la encuesta puede ser una buena idea en lugar de GCM (por ejemplo, para puntajes de cricket). Sugeriría probar / perfilar tanto el sondeo como el GCM para la latencia y el consumo de CPU / batería.
Hay un aspecto de a SyncAdapterque no ha sido mencionado por las otras respuestas.
El SyncAdapterpatrón requiere que tenga una autoridad de ContentProvider específica con la que sincronice y un tipo de cuenta específico (consulte Autenticador ) que se sincronizará. Por lo tanto, a menos que ya tenga esos componentes en su arquitectura (por ejemplo, porque le da acceso a otras aplicaciones a sus datos o necesita respaldar cuentas), SyncAdapteresto causará una sobrecarga de implementación significativa.
Cuando se trata de sincronizar datos que implican conectividad, también querrá poder escalar. Creo que la forma recomendada de hacerlo es usar el adaptador de sincronización.
El componente del adaptador de sincronización en su aplicación encapsula el código para las tareas que transfieren datos entre el dispositivo y un servidor. Según la programación y los desencadenantes que proporciona en su aplicación, el marco del adaptador de sincronización ejecuta el código en el componente del adaptador de sincronización ...
Los adaptadores de sincronización deben usarse a menos que necesite datos en tiempo real porque, automatiza la transferencia de datos según una variedad de criterios, como cambios de datos, tiempo transcurrido, hora del día, etc. Centraliza todas las transferencias de datos para que su transferencia de datos se realice junto con transferencias de datos desde otras aplicaciones, lo que reduce el uso de la batería.
Para tareas instantáneas que podemos usar,
AsyncTask para tareas de corta duración, puede ser de 3-4 segundos.
Gran desglose para las elecciones de regla general.
Brill Pappin
0
Como estamos hablando de diseño, debemos mencionar la administración de SyncAdapters, el objeto SyncResult y lo que sucede después.
De hecho, uso un SyncAdapter para decirle a mi biblioteca que realice llamadas web IntentService a mi servidor. Administrar esta operación de "sincronización" es complicado.
Un enfoque que estoy tomando ahora es renunciar completamente al objeto SyncResult y simplemente usar un servicio para registrar los resultados de cada "Sincronización" individual
Hay un aspecto de a
SyncAdapter
que no ha sido mencionado por las otras respuestas.El
SyncAdapter
patrón requiere que tenga una autoridad de ContentProvider específica con la que sincronice y un tipo de cuenta específico (consulte Autenticador ) que se sincronizará. Por lo tanto, a menos que ya tenga esos componentes en su arquitectura (por ejemplo, porque le da acceso a otras aplicaciones a sus datos o necesita respaldar cuentas),SyncAdapter
esto causará una sobrecarga de implementación significativa.fuente
Cuando se trata de sincronizar datos que implican conectividad, también querrá poder escalar. Creo que la forma recomendada de hacerlo es usar el adaptador de sincronización.
También parece ser así si consulta la guía de seguimiento de Android: Creación de un adaptador de sincronización
fuente
Los adaptadores de sincronización deben usarse a menos que necesite datos en tiempo real porque, automatiza la transferencia de datos según una variedad de criterios, como cambios de datos, tiempo transcurrido, hora del día, etc. Centraliza todas las transferencias de datos para que su transferencia de datos se realice junto con transferencias de datos desde otras aplicaciones, lo que reduce el uso de la batería.
Para tareas instantáneas que podemos usar,
AsyncTask para tareas de corta duración, puede ser de 3-4 segundos.
IntentService para tareas de larga duración.
fuente
Como estamos hablando de diseño, debemos mencionar la administración de SyncAdapters, el objeto SyncResult y lo que sucede después.
De hecho, uso un SyncAdapter para decirle a mi biblioteca que realice llamadas web IntentService a mi servidor. Administrar esta operación de "sincronización" es complicado.
Un enfoque que estoy tomando ahora es renunciar completamente al objeto SyncResult y simplemente usar un servicio para registrar los resultados de cada "Sincronización" individual
fuente