Jetpack組件WorkManager簡單demo

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
如果覺得有用,點個贊吧

發佈了92 篇原創文章 · 獲贊 40 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章