การอัปเดตฐานข้อมูลในพื้นหลัง
ตั้งแต่ sorisdk 4.2.2 เป็นต้นมา คุณสามารถอัปเดตฐานข้อมูลการรู้จำเสียงในพื้นหลังได้ด้วย method updateDatabase ใหม่ ฟีเจอร์นี้ช่วยให้สื่อ (Material) สำหรับการรู้จำเสียงเป็นปัจจุบันอยู่เสมอโดยไม่รบกวนกระบวนการรู้จำ
ภาพรวม
method SORIAudioRecognizer.shared().updateDatabase(context) ช่วยให้คุณอัปเดตฐานข้อมูลการรู้จำเสียงจากเซิร์ฟเวอร์ได้ทุกเมื่อ ไม่ว่าการรู้จำเสียงกำลังทำงานอยู่หรือไม่ ฟีเจอร์นี้มีประโยชน์อย่างยิ่งสำหรับอุปกรณ์ที่ใช้การรู้จำเสียงอย่างต่อเนื่องเป็นเวลานาน
ตัวอย่างเช่น เมื่อเพิ่มสื่อเสียงใหม่ลงในเซิร์ฟเวอร์ขณะที่การรู้จำเสียงทำงานอยู่ การเรียก method นี้จะช่วยให้คุณใช้สื่อเสียงใหม่ได้ทันทีโดยไม่ต้องเริ่มกระบวนการรู้จำใหม่
อัปเดตฐานข้อมูลด้วยตนเอง
คุณสามารถอัปเดตฐานข้อมูลด้วยตนเองได้ทุกเมื่อโดยเรียก method 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}")
}SORIUpdateResult updateResult = SORIAudioRecognizer.shared().updateDatabase(this);
if (updateResult.getSuccess()) {
if (updateResult.getUpdateAvailable()) {
Log.i("SORI", "Database updated successfully to version: " + updateResult.getCurrentVersion());
} else {
Log.d("SORI", "Database is already up to date (version: " + updateResult.getCurrentVersion() + ")");
}
} else {
Log.e("SORI", "Database update failed: " + updateResult.getErrorMessage());
}อัปเดตในพื้นหลังเป็นระยะด้วย WorkManager
สำหรับการอัปเดตเป็นระยะโดยอัตโนมัติ คุณสามารถใช้ WorkManager ของ Android เพื่อกำหนดเวลาการอัปเดตฐานข้อมูลในพื้นหลัง วิธีนี้ช่วยให้ฐานข้อมูลการรู้จำเสียงเป็นปัจจุบันโดยไม่ต้องดำเนินการด้วยตนเอง
ตั้งค่าการอัปเดตเป็นระยะ
เพิ่มโค้ดต่อไปนี้ลงในไฟล์ MainActivity.kt หรือ MainActivity.java เพื่อตั้งค่าการอัปเดตฐานข้อมูลเป็นระยะ:
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")
}private void setupPeriodicDatabaseUpdate() {
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(
UpdateDatabaseWorker.class, 2, TimeUnit.HOURS)
.setConstraints(constraints)
.build();
WorkManager.getInstance(this).enqueueUniquePeriodicWork(
"UpdateSORIDatabase",
ExistingPeriodicWorkPolicy.KEEP,
workRequest
);
Log.d("SORI", "Periodic database update scheduled every 2 hours");
}การเพิ่มประสิทธิภาพแบตเตอรี่
การตั้งค่า worker ให้ทำงานถี่เกินไปอาจส่งผลเสียต่อ Android vitals เช่น การใช้แบตเตอรี่ เราแนะนำให้กำหนดช่วงเวลาอย่างน้อย 2 ชั่วโมงเพื่อรักษาประสิทธิภาพสูงสุดของอุปกรณ์
สร้างคลาส Worker
สร้างไฟล์ใหม่ UpdateDatabaseWorker.kt หรือ UpdateDatabaseWorker.java ในโปรเจกต์ด้วยการนำไปใช้ต่อไปนี้:
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
/**
* Worker class that periodically updates the SORI audio recognition database.
* This worker runs every 2 hours to check for and download new audiopack updates.
*/
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")
// Get the SORI recognizer instance
val recognizer = SORIAudioRecognizer.shared()
// Perform the database update
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}")
// Return retry for temporary failures, success for permanent failures
if (updateResult.errorMessage?.contains("Authentication failed") == true) {
Result.failure() // Don't retry authentication failures
} else {
Result.retry() // Retry for network issues, etc.
}
}
} catch (e: Exception) {
Log.e(TAG, "Unexpected error during database update", e)
Result.retry()
}
}
}package com.iplateia.soriexample;
import android.content.Context;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.work.Worker;
import androidx.work.WorkerParameters;
import com.iplateia.sorisdk.SORIAudioRecognizer;
import com.iplateia.sorisdk.SORIUpdateResult;
/**
* Worker class that periodically updates the SORI audio recognition database.
* This worker runs every 2 hours to check for and download new audiopack updates.
*/
public class UpdateDatabaseWorker extends Worker {
private static final String TAG = "UpdateDatabaseWorker";
public UpdateDatabaseWorker(@NonNull Context context, @NonNull WorkerParameters params) {
super(context, params);
}
@NonNull
@Override
public Result doWork() {
try {
Log.d(TAG, "Starting periodic database update check");
// Get the SORI recognizer instance
SORIAudioRecognizer recognizer = SORIAudioRecognizer.shared();
// Perform the database update
SORIUpdateResult updateResult = recognizer.updateDatabase(getApplicationContext());
if (updateResult.getSuccess()) {
if (updateResult.getUpdateAvailable()) {
Log.i(TAG, "Database updated successfully to version: " + updateResult.getCurrentVersion());
} else {
Log.d(TAG, "Database is already up to date (version: " + updateResult.getCurrentVersion() + ")");
}
return Result.success();
} else {
Log.e(TAG, "Database update failed: " + updateResult.getErrorMessage());
// Return retry for temporary failures, success for permanent failures
String errorMessage = updateResult.getErrorMessage();
if (errorMessage != null && errorMessage.contains("Authentication failed")) {
return Result.failure(); // Don't retry authentication failures
} else {
return Result.retry(); // Retry for network issues, etc.
}
}
} catch (Exception e) {
Log.e(TAG, "Unexpected error during database update", e);
return Result.retry();
}
}
}เพิ่ม WorkManager dependencies
ตรวจสอบว่าได้เพิ่ม WorkManager dependency ลงในไฟล์ build.gradle แล้ว:
dependencies {
implementation "androidx.work:work-runtime-ktx:2.9.0" // For Kotlin
// or
implementation "androidx.work:work-runtime:2.9.0" // For Java
}dependencies {
implementation("androidx.work:work-runtime-ktx:2.9.0") // For Kotlin
// or
implementation("androidx.work:work-runtime:2.9.0") // For Java
}การเริ่มต้น
เรียก method setupPeriodicDatabaseUpdate() ใน method MainActivity.onCreate() หรือในโค้ดเริ่มต้นของแอปพลิเคชัน:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ... your existing code ...
// Set up periodic database updates
setupPeriodicDatabaseUpdate()
}@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ... your existing code ...
// Set up periodic database updates
setupPeriodicDatabaseUpdate();
}แนวทางปฏิบัติที่ดี
ข้อจำกัดของเครือข่าย: กำหนดข้อจำกัดของเครือข่ายเสมอ เพื่อให้อัปเดตเฉพาะเมื่อเชื่อมต่อและหลีกเลี่ยงการใช้ข้อมูลโดยไม่จำเป็น
การจัดการข้อผิดพลาด: ใช้การจัดการข้อผิดพลาดที่เหมาะสมเพื่อแยกปัญหาเครือข่ายชั่วคราว (ลองใหม่) ออกจากความล้มเหลวถาวร (ไม่ต้องลองใหม่)
การบันทึก log: เพิ่มการบันทึก log ที่เหมาะสมเพื่อติดตามกระบวนการอัปเดตและวินิจฉัยปัญหา
ความถี่ในการอัปเดต: คำนึงถึงอายุแบตเตอรี่และการใช้ข้อมูลของผู้ใช้เมื่อกำหนดความถี่ในการอัปเดต เราแนะนำให้กำหนดช่วงเวลาอย่างน้อย 2 ชั่วโมง
ประสบการณ์ผู้ใช้: เนื่องจากฐานข้อมูลอัปเดตในพื้นหลัง หากเกี่ยวข้องกับ UX ของแอป ควรแจ้งให้ผู้ใช้ทราบว่าฐานข้อมูลอัปเดตล่าสุดเมื่อใด
การแก้ไขปัญหา
หากพบปัญหาเกี่ยวกับการอัปเดตในพื้นหลัง:
- ตรวจสอบการเชื่อมต่อเครือข่าย: ตรวจสอบว่าอุปกรณ์เชื่อมต่ออินเทอร์เน็ตอย่างเสถียร
- ตรวจสอบ API Credentials: ตรวจสอบว่ากำหนดค่า API key และ secret อย่างถูกต้อง
- ตรวจสอบ Logs: ตรวจสอบข้อความข้อผิดพลาดใน logs ที่อาจช่วยระบุปัญหา
- ข้อจำกัดของ WorkManager: ตรวจสอบว่าข้อจำกัด WorkManager เหมาะกับ use case ของคุณ
เอกสารอ้างอิง API
โปรดดูข้อมูลโดยละเอียดเกี่ยวกับ method updateDatabase และค่าที่คืนได้ที่ เอกสารอ้างอิง API
