Docs 菜单
Docs 主页
/ /
Atlas Device SDKs
/ /

在背景同步数据 - Kotlin SDK

在此页面上

  • 先决条件
  • 例子
  • 同步逻辑
  • Worker

如果您需要在应用未运行时同步数据,您可以在背景进程中同步 Realm。

要开始后台同步,您需要将以下依赖项添加到您的 Android 应用程序中:

  • androidx.work:work-runtime 将作业排入队列

  • androidx.concurrent:concurrent-futures 从后台工作人员返回作业结果

背景同步需要满足两个条件:

  • 同步逻辑

  • 定期执行同步逻辑的计划作业

首先,编写同步 Realm 的自定义逻辑。 将此逻辑视为与后端的独立运行的实例连接。因此,您需要:

  1. 获取应用的 Realm 同步配置

  2. 对用户进行身份验证以打开域。对于刷新令牌未过期的已登录用户,您可以使用缓存的用户档案。

  3. 打开域,然后使用SyncSession.downloadAllServerChanges()SyncSession.uploadAllLocalChanges()将域与后端完全同步。 有关更多信息,请参阅管理同步会话。

  4. 关闭 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>
@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"
}
}

要创建定期执行背景同步的工作线程:

  1. 创建一设立 约束 指定工作线程所需的条件。由于同步域会使用数据,因此应考虑仅当设备启动时在背景下载更改:

    • 电池电量低

    • 使用计量数据源

  2. 指定工作线程的执行频率。 重复间隔取决于 域 中数据更新的频率以及用户打开应用程序的频率:

    • 如果域全天频繁更新,请考虑将重复间隔设置为 1-3 小时。

    • 如果域每天仅更新少量内容,则最好设置较低的重复间隔,并且每天仅进行一到两次背景同步。

  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
)

后退

将数据流式传输至 Atlas