1.WorkManager
WorkManager,個人理解它是一個後臺任務管理器,可以保證那些不一定即時完成但一定要完成的任務,WorkManager必須工作在jdk1.8以上
使用前先添加依賴:implementation "androidx.work:work-runtime-ktx:2.1.0
如果代碼沒錯,但是就是編譯不通過,可以參考GitHub上的build.gradle配置
2.繼承Work類,寫自己的work類:AppDatabaseWorker
AppDatabaseWorker類是在數據庫被創建伊始時,往數據庫內添加數據
package com.example.ngsl.room
import android.content.Context
import android.util.Log
import androidx.work.CoroutineWorker
import androidx.work.WorkerParameters
import com.example.ngsl.WORD_JSON_FILE_NAME
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.google.gson.stream.JsonReader
import kotlinx.coroutines.coroutineScope
//新建數據庫時,會執行以下任務:將json文件導入數據庫
//這裏我繼承的是CoroutineWorker,一個協程工作者
class AppDatabaseWorker(context: Context, workerParams: WorkerParameters) :
CoroutineWorker(context, workerParams) {
//必須重載doWork方法
override suspend fun doWork(): Result = coroutineScope {
//整個try就是你想實現的功能,最後一定也要有Result.success()語句
try {
applicationContext.assets.open(WORD_JSON_FILE_NAME).use { inputStream ->
JsonReader(inputStream.reader()).use { jsonReader ->
//讀取JSON文件
val wordType = object : TypeToken<List<Word>>() {}.type
val wordList: List<Word> = Gson().fromJson(jsonReader, wordType)
//寫入數據庫
val wordRepository = WordRepository.getInstance(applicationContext)
wordRepository.insertAll(wordList)
Result.success()
}
}
} catch (ex: Exception) {
Log.e(TAG, "Error seeding database", ex)
Result.failure()
}
}
companion object {
//打印日誌的標籤
private val TAG = AppDatabaseWorker::class.java.simpleName
}
}
3.調用WorkManager
這是我的一個數據庫類AppDatabase ,在被創建伊始時,往數據庫內添加數據
package com.example.ngsl.room
import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.sqlite.db.SupportSQLiteDatabase
import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.WorkManager
import com.example.ngsl.DATABASE_NAME
@Database(entities = [Word::class] , version = 1, exportSchema = false)
abstract class AppDatabase : RoomDatabase() {
abstract fun wordDao(): WordDao
companion object {
// 保證單例模式
@Volatile private var instance: AppDatabase? = null
fun getInstance(context: Context): AppDatabase {
return instance ?: synchronized(this) {
instance ?: buildDatabase(context).also { instance = it }
}
}
// 創建數據庫
private fun buildDatabase(context: Context): AppDatabase {
return Room.databaseBuilder(context, AppDatabase::class.java, DATABASE_NAME)
.addCallback(object : RoomDatabase.Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
//調用WorkManager,OneTimeWorkRequestBuilder表示一次提交完成任務
val request = OneTimeWorkRequestBuilder<AppDatabaseWorker>().build()
WorkManager.getInstance(context).enqueue(request)
}
})
.build()
}
}
}
4.GitHub源碼鏈接
整個項目有很多組件,只看你需要的部分:https://github.com/YDDUONG/NGSL-English
如果覺得有用,點個贊吧