在背景同步数据 - Kotlin SDK
Atlas Device SDK 已弃用。 有关详细信息,请参阅弃用页面。
如果您需要在应用未运行时同步数据,您可以在背景进程中同步 Realm。
先决条件
要开始后台同步,您需要将以下依赖项添加到您的 Android 应用程序中:
例子
背景同步需要满足两个条件:
同步逻辑
定期执行同步逻辑的计划作业
同步逻辑
首先,编写同步 Realm 的自定义逻辑。 将此逻辑视为与后端的独立运行的实例连接。因此,您需要:
获取应用的 Realm 同步配置
对用户进行身份验证以打开域。对于刷新令牌未过期的已登录用户,您可以使用缓存的用户档案。
打开域,然后使用SyncSession.downloadAllServerChanges() 和SyncSession.uploadAllLocalChanges()将域与后端完全同步。 有关更多信息,请参阅管理同步会话。
关闭 Realm。
您可以使用 CoroutineWorker 的子类作为背景进程执行此逻辑 。将同步逻辑放入工作线程的 doWork()
方法中。
示例 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> 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" } }
Worker
要创建定期执行背景同步的工作线程:
创建一设立 约束 指定工作线程所需的条件。由于同步域会使用数据,因此应考虑仅当设备未启动时在背景下载更改:
电池电量低
使用计量数据源
指定工作线程的执行频率。 重复间隔取决于 域 中数据更新的频率以及用户打开应用程序的频率:
如果域全天频繁更新,请考虑将重复间隔设置为 1-3 小时。
如果域每天仅更新少量内容,则最好设置较低的重复间隔,并且每天仅进行一到两次背景同步。
使用 Android 操作系统对您的工作线程进行排队。 为其分配唯一标识符,以便将来更新作业。
提示
您可以在应用程序的应用程序子类内创建背景同步作业,以保证每次运行应用程序时逻辑仅执行一次。
示例 Worker
// 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 )