Docs Menu
Docs Home
/ /
Sincronizar datos del dispositivo

Sincronizar datos en segundo plano - SDK de Kotlin

Si necesita sincronizar datos cuando su aplicación no se está ejecutando, puede sincronizar reinos en un proceso en segundo plano.

Para comenzar con la sincronización en segundo plano, debe agregar las siguientes dependencias a su aplicación de Android:

  • androidx.work:tiempo de ejecución del trabajo para poner trabajos en cola

  • androidx.concurrent:concurrent-futures para devolver los resultados del trabajo de un trabajador en segundo plano

La sincronización en segundo plano requiere dos cosas:

  • Lógica de sincronización

  • Un trabajo programado que realiza periódicamente la lógica de sincronización

Primero, escribe la lógica personalizada que sincroniza tu dominio. Considera esta lógica como una conexión independiente con tu backend. Por lo tanto, necesitarás:

  1. Obtenga la configuración de sincronización de Realm para su aplicación

  2. Autenticar a un usuario para abrir el dominio. Puedes usar las credenciales almacenadas en caché de un usuario que haya iniciado sesión y cuyo token de actualización no haya caducado.

  3. Abra el dominio y use SyncSession.downloadAllServerChanges() y SyncSession.uploadAllLocalChanges() para sincronizarlo completamente con el backend. Para más información,consulte Administrar sesiones de sincronización.

  4. Cierra el reino.

Puedes ejecutar esta lógica como un proceso en segundo plano usando una subclase de CoroutineWorker. Coloca tu lógica de sincronización en el doWork() método de su trabajador.

Ejemplo RealmBackgroundWorker.kt
package com.mongodb.app.worker
import android.annotation.SuppressLint
import android.content.Context
import androidx.concurrent.futures.ResolvableFuture
import androidx.work.CoroutineWorker
import androidx.work.WorkerParameters
import com.mongodb.app.app
import com.mongodb.app.data.RealmSyncRepository
import io.realm.kotlin.Realm
import io.realm.kotlin.mongodb.syncSession
class RealmBackgroundWorker(context: Context, workerParams: WorkerParameters) :
CoroutineWorker(context, workerParams) {
private lateinit var future: ResolvableFuture<Result>
@SuppressLint("RestrictedApi")
override suspend fun doWork(): Result {
future = ResolvableFuture.create()
// Get the realm configuration for your app
val syncRepository = RealmSyncRepository { session, error ->
future.setException(error)
}
val config = syncRepository.getRealmConfiguration()
// Check if user is logged-in
if (app.currentUser?.loggedIn == true) {
val realm = Realm.open(config)
try {
realm.syncSession.downloadAllServerChanges()
realm.syncSession.uploadAllLocalChanges()
} catch (e: InterruptedException) {
e.printStackTrace()
} finally {
realm.close()
}
return future.get()
}
companion object {
const val UNIQUE_WORK_NAME = "RealmBackgroundWorker"
}
}

Para crear un trabajador que realice periódicamente una sincronización en segundo plano:

  1. Cree un conjunto de restricciones que especifiquen las condiciones requeridas para su trabajador. Dado que la sincronización de un dominio utiliza datos, debería considerar descargar los cambios en segundo plano únicamente cuando el dispositivo no esté:

    • Batería baja

    • Uso de una fuente de datos medida

  2. Especifique la frecuencia con la que se debe ejecutar su trabajador. El intervalo de repetición depende de la frecuencia con la que se actualizan los datos en el dominio y de la frecuencia con la que los usuarios abren su aplicación.

    • Si el reino se actualiza con frecuencia durante el día, considere establecer un intervalo de repetición de 1a3 horas.

    • Si el reino solo se actualiza una pequeña cantidad de veces al día, es mejor establecer un intervalo de repetición menos frecuente y sincronizar en segundo plano solo una o dos veces al día.

  3. Ponga en cola a su trabajador con el sistema operativo Android. Asígnele un identificador único para poder actualizar el trabajo en el futuro.

Tip

Puede crear el trabajo de sincronización en segundo plano dentro de una subclase de aplicación en su aplicación para garantizar que la lógica solo se ejecute una vez cada vez que se ejecuta su aplicación.

Ejemplo de trabajador
// Define any constraints for the background job
val constraints: Constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED)
.setRequiresBatteryNotLow(true)
.build()
// Define the frequency of the background job
val backgroundRealmSync =
PeriodicWorkRequestBuilder<RealmBackgroundWorker>(
// Repeat every 12 hours
12, TimeUnit.HOURS,
// Execute job at any point during that 12-hour period
12, TimeUnit.HOURS
)
.setConstraints(constraints)
.build()
// Enqueue the work job, replacing it with the most recent
// version if we update it
WorkManager.getInstance(this).enqueueUniquePeriodicWork(
RealmBackgroundWorker.UNIQUE_WORK_NAME,
ExistingPeriodicWorkPolicy.UPDATE,
backgroundRealmSync
)

Volver

Transmitir datos a Atlas

En esta página