백그라운드 데이터베이스 업데이트
sorisdk 4.2.1부터 새로운 updateDatabase
메서드를 사용하여 백그라운드에서 오디오 인식 데이터베이스를 업데이트할 수 있습니다. 이 기능을 사용하면 인식 프로세스를 중단하지 않고도 오디오 인식 소재를 최신 상태로 유지할 수 있습니다.
개요
SORIAudioRecognizer.shared().updateDatabase(context)
메서드를 사용하면 오디오 인식이 현재 실행 중인지 여부와 관계없이 언제든지 서버에서 오디오 인식 데이터베이스를 업데이트할 수 있습니다. 이는 장시간 동안 오디오 인식을 연속적으로 실행하는 기기에서 특히 유용합니다.
예를 들어, 오디오 인식이 활성 상태인 동안 서버에 새로운 오디오 소재가 추가되었을 때, 이 메서드를 호출하면 인식 프로세스를 다시 시작하지 않고도 새로운 오디오 소재를 즉시 사용할 수 있습니다.
수동 데이터베이스 업데이트
updateDatabase
메서드를 호출하여 언제든지 수동으로 데이터베이스를 업데이트할 수 있습니다:
val updateResult = SORIAudioRecognizer.shared().updateDatabase(this)
if (updateResult.success) {
if (updateResult.updateAvailable) {
Log.i("SORI", "Database updated successfully to version: ${updateResult.currentVersion}")
} else {
Log.d("SORI", "Database is already up to date (version: ${updateResult.currentVersion})")
}
} else {
Log.e("SORI", "Database update failed: ${updateResult.errorMessage}")
}
WorkManager를 사용한 주기적 백그라운드 업데이트
자동 주기적 업데이트를 위해 Android의 WorkManager를 사용하여 백그라운드 데이터베이스 업데이트를 예약할 수 있습니다. 이 방법을 사용하면 수동 개입 없이도 오디오 인식 데이터베이스를 최신 상태로 유지할 수 있습니다.
주기적 업데이트 설정
MainActivity.kt
파일에 다음 코드를 추가하여 주기적 데이터베이스 업데이트를 설정합니다:
private fun setupPeriodicDatabaseUpdate() {
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
val workRequest = PeriodicWorkRequestBuilder<UpdateDatabaseWorker>(2, TimeUnit.HOURS)
.setConstraints(constraints)
.build()
WorkManager.getInstance(this).enqueueUniquePeriodicWork(
"UpdateSORIDatabase",
ExistingPeriodicWorkPolicy.KEEP,
workRequest
)
Log.d("SORI", "Periodic database update scheduled every 2 hours")
}
배터리 최적화
워커가 너무 자주 실행되도록 설정하면 배터리 소모 등 Android 바이탈에 부정적인 영향을 미칠 수 있습니다. 최적의 기기 성능을 유지하려면 2시간 이상의 간격을 사용하는 것이 좋습니다.
워커 클래스 생성
프로젝트에 다음 구현이 포함된 새로운 UpdateDatabaseWorker.kt
파일을 생성합니다:
package com.iplateia.soriexample
import android.content.Context
import android.util.Log
import androidx.work.CoroutineWorker
import androidx.work.WorkerParameters
import com.iplateia.sorisdk.SORIAudioRecognizer
/**
* SORI 오디오 인식 데이터베이스를 주기적으로 업데이트하는 워커 클래스입니다.
* 이 워커는 2시간마다 실행되어 새로운 오디오팩 업데이트를 확인하고 다운로드합니다.
*/
class UpdateDatabaseWorker(
context: Context,
params: WorkerParameters
) : CoroutineWorker(context, params) {
companion object {
private const val TAG = "UpdateDatabaseWorker"
}
override suspend fun doWork(): Result {
return try {
Log.d(TAG, "Starting periodic database update check")
// SORI 인식기 인스턴스 가져오기
val recognizer = SORIAudioRecognizer.shared()
// 데이터베이스 업데이트 수행
val updateResult = recognizer.updateDatabase(applicationContext)
if (updateResult.success) {
if (updateResult.updateAvailable) {
Log.i(TAG, "Database updated successfully to version: ${updateResult.currentVersion}")
} else {
Log.d(TAG, "Database is already up to date (version: ${updateResult.currentVersion})")
}
Result.success()
} else {
Log.e(TAG, "Database update failed: ${updateResult.errorMessage}")
// 일시적 실패에는 재시도, 영구적 실패에는 성공 반환
if (updateResult.errorMessage?.contains("Authentication failed") == true) {
Result.failure() // 인증 실패는 재시도하지 않음
} else {
Result.retry() // 네트워크 문제 등은 재시도
}
}
} catch (e: Exception) {
Log.e(TAG, "Unexpected error during database update", e)
Result.retry()
}
}
}
WorkManager 종속성 추가
build.gradle
파일에 WorkManager 종속성을 추가해야 합니다:
dependencies {
implementation "androidx.work:work-runtime-ktx:2.9.0"
}
초기화
MainActivity.onCreate()
메서드나 애플리케이션 초기화 코드에서 setupPeriodicDatabaseUpdate()
메서드를 호출합니다:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ... 기존 코드 ...
// 주기적 데이터베이스 업데이트 설정
setupPeriodicDatabaseUpdate()
}
모범 사례
네트워크 제약: 불필요한 데이터 사용을 방지하기 위해 연결된 상태에서만 업데이트가 발생하도록 항상 네트워크 제약을 설정합니다.
오류 처리: 일시적인 네트워크 문제(재시도)와 영구적인 실패(재시도 안 함)를 구분하기 위해 적절한 오류 처리를 구현합니다.
로깅: 업데이트 프로세스를 모니터링하고 문제를 진단하기 위해 적절한 로깅을 포함합니다.
업데이트 빈도: 업데이트 빈도를 설정할 때 사용자의 배터리 수명과 데이터 사용량을 고려합니다. 2시간 이상의 간격을 권장합니다.
사용자 경험: 데이터베이스 업데이트가 백그라운드에서 발생하므로 앱의 UX와 관련이 있는 경우 사용자에게 데이터베이스가 마지막으로 업데이트된 시간에 대한 정보를 제공하는 것을 고려합니다.
문제 해결
백그라운드 업데이트에서 문제가 발생하는 경우:
- 네트워크 연결 확인: 기기가 안정적인 인터넷 연결을 가지고 있는지 확인합니다.
- API 자격 증명 확인: API 키와 비밀이 올바르게 구성되었는지 확인합니다.
- 로그 검토: 문제를 식별하는 데 도움이 되는 특정 오류 메시지에 대한 로그를 확인합니다.
- WorkManager 제약: WorkManager 제약이 사용 사례에 적합한지 확인합니다.
API 레퍼런스
updateDatabase
메서드와 그 반환값에 대한 자세한 정보는 API 레퍼런스를 참조하세요.