[英]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.