Evitar el bucle de sincronización de red al sincronizar desde la red en Android ContentProvider

Estoy escribiendo mi propio ContentProvider que se sincronizará con un servicio web con un SyncAdapter.

Problema ocurre cuando el adaptador de sincronización está modificando los datos del proveedor de contenido, el proveedor activa una sincronización de red cuando llama internamente a getContentResolver (). NotifyChange provoca un bucle de sincronización.

El parámetro notifyChange con el indicador de sincronización de red es necesario cuando una aplicación cliente realiza la modificación pero debe evitarse cuando el adaptador de sincronización esté modificándose.

¿Cómo puede uno, dentro de un proveedor de contenido, saber fácilmente si está siendo utilizado por una aplicación cliente (que debería desencadenar la sincronización de red después de la modificación) o por un adaptador de sincronización (que no debería desencadenar la sincronización de red).

Actualmente utilizo diferentes CONTENT_URI (el adaptador de sincronización accede a los datos mediante un CONTENT_URI_NO_SYNC y las aplicaciones de cliente utilizando un CONTENT_URI) para poder distinguir entre los dos tipos de acceso y establecer el indicador de sincronización de red en consecuencia.

Mire este video sobre el uso de la API REST en SyncAdapter s.

El método que tratan es añadir un conjunto de columnas de indicadores de metadatos a la base de datos. Esto nos permite hacer 3 cosas.

  1. Las banderas mismas permiten que SyncAdapter determine las filas que necesitan cambios y cuáles son esos cambios. ¿Cómo se explica la diferencia entre una fila creada localmente y una fila modificada localmente? Además, ¿cómo saber qué API REST llama a hacer? Si acaba de eliminar una fila, ¿cómo sabe su SyncAdapter la fila que se eliminará si los datos se han ido? En su lugar, establezca el indicador "Debe eliminarse" y, cuando se ejecuta el SyncAdapter , sabe que debe enviar una supresión al servidor.

  2. Los indicadores permiten a su CursorAdapter modificar la vista que se crea (como añadir un Spinner para mostrar que "Esta fila se está sincronizando").

  3. Por último, y esto no señalan, las banderas le permiten decir por qué se está modificando la fila. Si ninguno de los indicadores está establecido y la fila cambia, debe haber sido debido a una actualización desde el servidor. Por lo tanto, no hay necesidad de sincronizar a la red.

Por lo tanto, los dos flujos de trabajo son los siguientes:

Cambio local

  1. La aplicación crea una nueva fila. La fila "crear" es verdadera.
  2. ContentProvider almacena la fila, ve crear notifyChange(...,true); y por lo que llama notifyChange(...,true);
  3. Sync to network = true (el parámetro final) hace que SyncAdapter dispare.
  4. SyncAdapter explora la base de datos, encuentra la fila con el flag create establecido y realiza la acción apropiada del servidor. Después de éxito, SyncAdapter borra el indicador (actualización de fila en ContentProvivder )
  5. ContentProvider ve la bandera clara, no se deja ninguna bandera, así que llama notifyChange (…, false);
  6. ContentObserver s ver el cambio de bandera, actualizar para que parezca "sincronizado terminado"

Todos estos pasos son equivalentes para update / delete – un indicador por fila sincronizable para cada uno de create / update / delete. También note la otra victoria – ¿Qué pasa si "Create" falla temporalmente? servidor abajo … ¿Cómo sabes que debes volver a intentarlo? – Simple, no borrar el "Crear" bandera y lo ves 15 minutos más tarde.

Cambio remoto

  1. SyncAdapter dispara debido a la sincronización periódica.
  2. SyncAdapter una actualización del servidor. Empuja los cambios en la base de datos. No establece ningún indicador. ContentProvider ve la falta de banderas, sabe que el cambio debe haber venido desde el servidor (o no es un cambio de base de datos que necesita ser empujado al servidor), por lo que llama notifyChange(...,false);
  3. ContentObserver s ver el cambio de contenido y por lo que se actualizan con nuevos datos de fila
  • Obtención del contexto de la actividad en un android de clase de no actividad
  • Play Servicios de ubicación getLastLocation devuelve null
  • Cambiar la apariencia del texto en estilos y temas para una aplicación de Android
  • Ejecutar mensajes del controlador en un subproceso de fondo
  • Solicitud con selección automática o de usuario del certificado de cliente apropiado
  • Cajón de navegación que no muestra pero que sigue abriendo
  • Soporte de speex en android
  • Cómo crear una lista de aplicaciones recientes / en ejecución
  • Chat wifi entre dos o más dispositivos Android
  • Conexión de socket SSL
  • Cómo agregar controles personalizados a MapFragment en Google Maps Android API v2?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.