백그라운드에서 데이터 동기화 - Kotlin SDK
앱이 실행되지 않을 때 데이터를 동기화해야 하는 경우 백그라운드 프로세스에서 Realm을 동기화할 수 있습니다.
전제 조건
백그라운드 동기화를 시작하려면 Android 애플리케이션에 다음 종속성을 추가해야 합니다.
androidx.concurrent:concurrent-futures 백그라운드 작업자의 작업 결과 반환
예시
백그라운드 동기화에는 두 가지가 필요합니다.
동기화 로직
주기적으로 동기화 로직을 수행하는 예약된 작업
동기화 로직
먼저 영역을 동기화하는 사용자 지정 로직을 작성합니다. 이 로직을 백엔드에 대한 독립형 연결로 취급합니다. 따라서 다음을 수행해야 합니다.
앱에 대한 Realm 동기화 구성 가져오기
사용자를 인증하여 영역을 엽니다. 새로 고침 토큰이 만료되지 않은 로그인한 사용자에 대해 사용자의 캐시된 자격 증명을 사용할 수 있습니다.
Realm을 연 다음 영역 () 를 사용합니다. 및 SyncSession.uploadAllLocalChanges() 를 사용하여 영역 을 백엔드 와 완전히 동기화합니다. 자세한 내용은 동기화 세션 관리를 참조하세요.
Realm을 닫습니다.
CoroutineWorker 의 하위 클래스를 사용하여 이 로직을 배경 프로세스 로 실행할 수 있습니다. . 동기화 로직을 작업자의 doWork()
메서드에 넣습니다.
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" } }
작업자
주기적으로 백그라운드 동기화를 수행하는 작업자를 만들려면 다음 안내를 따르세요.
제약 조건 설정하다 만들기 작업자에게 필요한 조건을 지정합니다. 영역 동기화에는 데이터가 사용되므로 기기가 다음과 같은 경우가 아닌 경우에만 변경 사항을 배경 에서 다운로드하는 것을 고려해야 합니다.
배터리 부족
측정 대상 데이터 소스 사용
작업자가 실행해야 하는 빈도를 지정합니다. 반복 간격은 영역에서 데이터가 업데이트되는 빈도와 사용자가 애플리케이션을 여는 빈도에 따라 달라집니다.
영역이 하루 종일 자주 업데이트되는 경우 반복 간격을 1~3시간으로 설정하는 것이 좋습니다.
영역이 하루에 몇 번만 업데이트하는 경우 반복 간격을 덜 자주 설정하고 하루에 한 두 번 백그라운드 동기화만 설정하는 것이 가장 좋습니다.
Android OS에 작업자를 대기열에 추가합니다. 나중에 작업을 업데이트할 수 있도록 고유 식별자를 할당합니다.
팁
앱의 애플리케이션 하위 클래스 내에서 백그라운드 동기화 작업을 만들어 애플리케이션이 실행될 때마다 로직이 한 번만 실행되도록 할 수 있습니다.
// 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 )