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.
- Posible motivo de "Error: no se pueden generar carpetas de vista java.lang.NullPointerException"
- ¿Hay alguna manera de declarar suprimir las advertencias a la declaración del método?
- Cómo preformar un mensaje Reddit con okhttp
- ¿Puedo estar seguro de que la aplicación Android terminó de ejecutarse comprobando isFinish () en OnPause () de la actividad principal?
- ¿Hay alguna biblioteca o algoritmo para el calendario persa (Shamsi o Jalali) en Android?
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.
- Print Todo el registro de solicitud se llama desde la biblioteca volley
- Anular los colores del menú contextual en Android
- LibGDX 0.9.9 - Aplicar cubemap en el entorno
- ¿Cómo puedo bloquear el diseño de mi programa Android a una orientación
- Cómo organizar el código fuente de Android en carpetas
- Diferencias entre varios tipos de bool?
- Cómo deshabilitar OnClickListerners
- Mantenimiento de cookies entre las solicitudes HTTP enviadas por Android Apps
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.
-
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 suSyncAdapter
la fila que se eliminará si los datos se han ido? En su lugar, establezca el indicador "Debe eliminarse" y, cuando se ejecuta elSyncAdapter
, sabe que debe enviar una supresión al servidor. -
Los indicadores permiten a su
CursorAdapter
modificar la vista que se crea (como añadir unSpinner
para mostrar que "Esta fila se está sincronizando"). -
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
- La aplicación crea una nueva fila. La fila "crear" es verdadera.
- ContentProvider almacena la fila, ve crear
notifyChange(...,true);
y por lo que llamanotifyChange(...,true);
- Sync to network = true (el parámetro final) hace que
SyncAdapter
dispare. -
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 enContentProvivder
) -
ContentProvider
ve la bandera clara, no se deja ninguna bandera, así que llama notifyChange (…, false); -
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
-
SyncAdapter
dispara debido a la sincronización periódica. -
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 llamanotifyChange(...,false);
-
ContentObserver
s ver el cambio de contenido y por lo que se actualizan con nuevos datos de fila
- ¿Se puede seleccionar un TextView y contener vínculos?
- El espacio de nombres 'anuncios' no está enlazado