android - 在协程 GlobalScope 上运行 Room Persistence Library 查询

标签 android kotlin android-room kotlin-coroutines

我读到在 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/

相关文章:

android - 如何从后台服务更新 ViewModel 的 LiveData 并更新 UI

android - 如何使用“房间关系”注释一次加入多个对象?

java - 在 Android 9 (Pie) 上使用 Retrofit 服务时出现空对象引用?

android - 以编程方式将 TableRow 添加到 TableLayout 不起作用

java - Kotlin 文件/类和 Kotlin 脚本有什么不同

maven - 使用Maven构建后,Jar文件不在目标文件夹中-KOTLIN

android - 是否可以在 android Room Query 中使用 StringFormat 或 Constant Variable

java - map fragment 在恢复时崩溃

Android 自定义对话框因布局而膨胀 - 对齐问题

arrays - KOTLIN 比较 n 维数组