Docs Menu
Docs Home
/ /
Sincronizar datos del dispositivo

Administrar una sesión de sincronización - SDK de Kotlin

Esta página describe las sesiones de sincronización y cómo administrarlas en una aplicación mediante Sincronización flexible. Para obtener información detallada sobre Sincronización flexible, consulte Sincronización de dispositivos Atlas en la documentación de servicios de aplicaciones.

Al usar la sincronización flexible, el SDK de Kotlin de Realm sincroniza los datos con Atlas en segundo plano mediante una sesión de sincronización. Esta sesión se inicia al abrir un reino sincronizado.

val app = App.create(YOUR_APP_ID)
val user = app.login(credentials)
val config = SyncConfiguration.Builder(user, setOf(Task::class))
.build()
// Open the synced realm
val realm = Realm.open(config)
// Sync session is now active
// ... do something with the synced realm

La sesión de sincronización gestiona lo siguiente:

  • Cargar y descargar cambios en el reino

  • Pausar y reanudar la sincronización

  • Monitoreo de la conectividad de la red

Puede acceder a la SyncSession de un único reino sincronizado a través de la propiedad realm.syncSession.

El SDK de Kotlin administra la comunicación con App Services en dos niveles:

  • Estado de conexión: el estado de la conexión de red entre un dispositivo cliente y su aplicación backend.

  • estado de la sesión: estado de sincronización de un solo usuario, que se puede pausar y reanudar en el SDK a voluntad (consulte la sección Pausar y reanudar una sesión de sincronización).

Ambos estados determinan si los cambios locales de un usuario se sincronizan con el backend. La sincronización solo ocurre cuando SyncSession.ConnectionState es CONNECTED y SyncSession.State es ACTIVE DYINGo.

Para esperar asincrónicamente a que se carguen todos los cambios a Atlas desde el dominio sincronizado, llame a uploadAllLocalChanges. Este método devuelve true cuando se hayan cargado todos los cambios.

Para esperar asincrónicamente a que todos los cambios en Atlas se descarguen del servidor de sincronización de dispositivos a su dominio sincronizado, llame a downloadAllServerChanges. Este método devuelve true cuando se hayan descargado todos los cambios.

También puede incluir un parámetro timeout opcional en cualquiera de los métodos para determinar el tiempo máximo antes de devolver false. Tenga en cuenta que la carga o descarga continúa en segundo plano incluso después de devolver false.

El siguiente ejemplo demuestra cómo llamar a ambos métodos con un tiempo de espera definido:

// Wait to download all pending changes from Atlas
realm.syncSession.downloadAllServerChanges(1.minutes)
// Add data locally
realm.write {
this.copyToRealm(Task().apply {
taskName = "Review proposal"
assignee = "Emma"
progressMinutes = 0
})
}
// Wait for local changes to be uploaded to Atlas
realm.syncSession.uploadAllLocalChanges(1.minutes)

Para pausar la sincronización de una sesión, llame a syncSession.pause(). El dominio no sincronizará los cambios con Atlas mientras la sesión esté pausada.

Para reanudar la sincronización de cambios, llame a syncSession.resume().

Debes llamar manualmente a syncSession.pause() y syncSession.resume() para cada reino cuya sesión de sincronización quieras pausar y reiniciar. El estado de sincronización de una sesión no afecta a las demás sesiones abiertas.

El siguiente bloque de código demuestra cómo llamar a estos métodos:

// Pause the sync session
// Data that you write while session is paused does not sync to Atlas
realm.syncSession.pause()
// Add data locally
realm.write {
this.copyToRealm(Task().apply {
taskName = "Submit expense report"
assignee = "Kevin"
progressMinutes = 0
})
}
// Resume sync session
// Local changes now sync to Atlas
realm.syncSession.resume()

En la mayoría de las aplicaciones, no es necesario pausar y reanudar manualmente una sesión de sincronización. Sin embargo, existen algunas circunstancias en las que podría ser conveniente pausar o suspender una sesión de sincronización:

  • Solo desea sincronizar después de que el usuario realice una acción específica

  • Solo desea sincronizar durante un momento determinado del día.

  • No debes intentar sincronizar cuando hay una mala conectividad de red

  • Quiere forzar explícitamente una sesión de sincronización para conectarse

En el caso de una mala conectividad de red, intentar continuamente establecer una conexión de red puede agotar la batería del dispositivo del usuario.

El caso de forzar explícitamente la conexión de una sesión de sincronización suele estar relacionado con estar desconectado durante un tiempo. El cliente de sincronización intenta conectarse y, al fallar, entra en una fase de desconexión exponencial. Tras un tiempo prolongado desconectado, es posible que el cliente no se vuelva a conectar inmediatamente. Pausar y reanudar la sesión de sincronización fuerza explícitamente la conexión.

Cuando pause una sesión de sincronización, tenga en cuenta lo siguiente:

  • Si el cliente puede estar fuera de línea por un tiempo mayor al máximo permitido, no podrá reanudar la sincronización y deberá reiniciarlo.

  • Pausar una sesión de sincronización la pausa en ambos sentidos. Los cambios que realiza la aplicación en el dispositivo no se sincronizan con el backend, y los cambios en los datos del backend o de otros dispositivos no se sincronizan con el dispositivo. No es posible pausar solo las cargas ni las descargas.

  • No pause una sesión de sincronización si desea que un cliente deje de sincronizarse permanentemente con el backend. Para ello, copie el contenido del dominio sincronizado en uno no sincronizado y utilice este último en el cliente.

No pause la sincronización para detenerla por períodos indefinidos o intervalos de tiempo de meses o años. Esta función no está diseñada ni probada para estos casos de uso. Podría experimentar diversos problemas al usarla de esta manera.

Puede obtener el estado de la conexión de red actual comprobando el SyncSession.connectionState propiedad. Esto devuelve un valor enum de ConnectionState que indica el estado de la conexión de red. Los posibles estados son: CONNECTED, DISCONNECTED o CONNECTING.

if (realm.syncSession.connectionState == ConnectionState.CONNECTED) {
Log.i("Connected to network")
// ... do something
}

Monitorea el estado de la conexión de red con connectionStateAsFlow. Esta propiedad devuelve un flujo de objetos ConnectionStateChange que se actualiza cuando cambia la conexión de red. Puedes acceder a los objetos, tanto nuevos como antiguos,ConnectionState ConnectionStateChangedesde.

val connectionFlow = realm.syncSession.connectionStateAsFlow()
connectionFlow.collect { ConnectionStateChange ->
if (ConnectionStateChange.newState == ConnectionState.CONNECTED) {
Log.i("Connected to Atlas Device Sync server")
}
}

Nuevo en la versión 1.11.0.

Realm detecta automáticamente cuando un dispositivo recupera la conectividad después de estar fuera de línea e intenta reconectarse utilizando una estrategia de retroceso incremental.

En la versión y posteriores del SDK de Kotlin,1.11.0 puede optar por activar manualmente un intento de reconexión con App.Sync.reconnect() en lugar de esperar a que finalice la interrupción incremental. Esto es útil si comprende con mayor precisión las condiciones de la red (por ejemplo, al supervisar los cambios de red con en Android) y no desea depender de la ConnectivityManager detección automática de reconexión de Realm. El SDK también llama automáticamente a este método cuando un dispositivo desactiva el modo avión.

Para activar manualmente un intento de reconexión, llame al método App.Sync.reconnect(), al que se accede a través de la interfaz App.Sync. A diferencia de SyncSession, que permite acceder a una sola sesión de sincronización de dominio, la App.Sync interfaz controla todas las sesiones de sincronización de su aplicación.

app.sync.reconnect()

Cuando se llama a este método, el SDK fuerza a todas las sesiones de sincronización a intentar reconectarse inmediatamente y restablece todos los temporizadores utilizados para el retroceso incremental.

Importante

No se puede reconectar dentro del tiempo de espera de lectura del socket

Realm tiene un tiempo de espera de lectura de socket predeterminado interno de minutos. Realm agotará el tiempo de espera 2 si una operación de lectura no recibe datos en un 2período de minutos. Si se llama App.Sync.reconnect() a dentro de ese período, el SDK de Kotlin no intenta reconectarse.

Volver

Escribir en un reino sincronizado

En esta página