我读到在 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 上运行它,我应该改变什么?
最佳答案
有lifecycleScope lifecycle-runtime-ktx
中提供的扩展名图书馆,见 Use Kotlin coroutines with Architecture components .只需将库添加到您应用的 build.gradle
...
dependencies {
...
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0"
}
还有viewModelScope可用,如果您使用 ViewModel图书馆。乍一看应该把这样的逻辑移到 View 模型中,这样查询结果会在配置更改期间保留。但是让我们使用
lifecycleScope
因为问题是关于 Activity 范围的。我还将回调替换为
suspend
功能。协程是回调的绝佳替代品,因此在可能的情况下最好使用协程。还有一件事,创建一个新的
AppDatabase
多次实例看起来不是一个好主意。最好创建一次并在整个应用程序中重复使用。您可以为此目的使用依赖注入(inject),请参阅 Manage dependencies between components .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
}
}
}
关于android - 在协程 GlobalScope 上运行 Room Persistence Library 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62369427/