簡體   English   中英

在協程 GlobalScope 上運行 Room Persistence Library 查詢

[英]Running Room Persistence Library queries on coroutines GlobalScope

我讀到在 GlobalScope 上運行例程是不好的做法。

現在正在做的是:

    class SplashScreen : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash_screen)


        DataBaseHelper.isDbEmpty(this, object : DataBaseHelper.OnCompleteCheckDB {
            override fun isDBEmpty(result: Boolean) {
                //handle result
            }
        })
    }
}

數據庫助手:

class DataBaseHelper() {

companion object {
    fun isDbEmpty(context: Context, param: OnCompleteCheckDB) {

        val db = AppDatabase(context)
        GlobalScope.launch(Dispatchers.IO) {
            val count = db.movieDao().countElements() <= 0
            withContext(Dispatchers.Main) {
                param.isDBEmpty(count)
            }
        }
    }
}
}

它有效,但這是不好的做法嗎? 如果我想在 ActivityScope 上運行它,我應該改變什么?

生命lifecycle-runtime-ktx庫中提供了生命周期范圍擴展,請參閱Use Kotlin coroutines with Architecture components 只需將庫添加到您應用的build.gradle

...
dependencies {
  ...
  implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0"
}

如果您使用ViewModel庫,還可以使用viewModelScope 乍一看應該把這樣的邏輯移到一個視圖 model 中,所以在配置更改時會保留查詢結果。 但是讓我們使用lifecycleScope范圍,因為問題是關於活動 scope。

我還用suspend function 替換了回調。 協程是回調的絕佳替代品,因此在可能的情況下最好使用協程。

還有一件事,多次創建新的AppDatabase實例看起來不是一個好主意。 最好創建一次並在整個應用程序中重復使用。 您可以為此目的使用依賴注入,請參閱管理組件之間的依賴關系

class DataBaseHelper() {
    companion object {
        suspend fun isDbEmpty(context: Context, param: OnCompleteCheckDB) = withContext(Dispatchers.IO) {
            val db = AppDatabase(context)
            db.movieDao().countElements() <= 0
        }
    }
}

class SplashScreen : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash_screen)

        lifecycleScope.launch {
            const dbIsEmpty = DataBaseHelper.isDbEmpty(this)
            //handle result
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM