当前位置: 首页 > 知识库问答 >
问题:

房间允许与Kotlin合作

晏晨朗
2023-03-14

Android官方文档指出,不建议使用allowMainThreadQueries(),因为它可能会长时间锁定UI并触发ANR。但是Kotlin协同程序使我们能够在主线程中执行一些操作,而不会有效地阻塞UI。

所以我要问:使用允许Main ThreadQueries()并在主线程上运行的Couroutine作用域中访问数据库是否安全?如下所示:

// WITH allowMainThreadQueries()
val activityJob = Job()
val mainScope = CoroutineScope(Dispatchers.Main + activityJob)
mainscope.launch {

    // access room database and retrieve some data

    // update UI with data retrived

}

或者我们应该坚持不允许主线程查询和在另一个线程中执行数据库查询的旧方法?

// WITHOUT allowMainThreadQueries()
val activityJob = Job()
val defaultScope = CoroutineScope(Dispatchers.Default + activityJob)
val mainScope = CoroutineScope(Dispatchers.Main + activityJob)
defaultScope.launch {

    // access room database and retrieve some data

    mainScope.launch {
        // update UI with data retrived
    }

}

我这样问是因为前一种方式(使用allowMainThreadQueries()):

  • 更具可读性(我可以在访问数据库的函数的同一个协同程序上下文中更新UI,而不必考虑在另一个协同程序范围中启动UI更新)
  • 允许更简单的错误处理
  • 只使用一个协同程序作用域(因此需要关心的作用域更少)

共有2个答案

卫嘉佑
2023-03-14

建议在您的ViewModel中访问viewModelScope中的数据库。如果您需要从活动或片段使用中访问房间数据库

lifecyclescope。在此处启动{//access数据库dao函数,这些函数在定义中是挂起的。}

或者在lifecycleScope中使用withContext(Dispatchers.IO){

周学义
2023-03-14

您不需要allowMainThreadQueries()就可以工作。作用域的协同程序在其线程中执行。

这就是我不久前所做的:

@UiThread
fun getUsers(context: Context): LiveData<List<User>> {
    if (!::users.isInitialized) {
        users = MutableLiveData()
        users.postValue(MyDatabase.get(context).users().getAll())
        GlobalScope.launch(Dispatchers.Main) {
            val usersFromDb: List<User> = async(Dispatchers.IO) {
                return@async MyDatabase.get(context).users().getAll()
            }.await()
            users.value = usersFromDb
        }
    }
    return users
}

您可以看到从主线程调用这个getUsers()方法,返回一个LiveData(在本例中很方便)。数据库查询在GlobalScope中进行。启动()

是的,你的设计是我个人喜欢的。一个有效的。但我认为您根本不需要allowMainThreadQueries()。请随意阅读(我的)博客帖子:https://proandroiddev.com/android-viewmodel-livedata-coroutines-contraption-e1e44af690a6

 类似资料:
  • 该应用程序在本地和tomcat服务器上运行良好,但是,当我们将该应用程序移动到WebLogic12c服务器(war部署)时,我们在访问服务时会看到以下错误。 BEA-382120错误:不允许混合XOP/MTOM和附件! 在WebLogic上部署时,消息似乎不再启用MTOM。 Spring WS配置,使用的库:spring-ws-1.5.8.jar commons-httpclient-3.1.ja

  • 我转换java代码到kotlin代码,我得到类型未解决的java类错误。 我的Java类是 已转换的Kotlin类 非常感谢。

  • 我试图得到以下每个元素使用 inspect元素的输出如下。 但是它失败了,并抛出下面的错误。 另外,我如何遍历每个类?每个类都包含子部分,我想在进入下一个类之前进一步单独处理这些子部分。

  • 转换器.KT FoodDatabase.kt 当我运行以下代码创建数据库时: 我还附上我的评分文件: 有人遇到过这个问题吗?

  • 我一直有这个问题:我无法在Android Studio中升级我的应用程序中的gradle版本和kotlin gradle插件,我能想到的唯一解决方案是从头开始一个项目,并在每个类中逐个移动。 我的应用程序使用Room,因此kapt作为注释过程。有了这个版本的kotlin和gradle,一切都完美地工作: 我的应用 gradle 文件 我试图更新到每个的当前最新版本,尽管这个问题存在于不太新的版本中

  • 我有一个正则表达式,允许一个大小写,一个小写,8-16个字符和大多数特殊字符,包括空间。我想在正则表达式中添加允许空间。 我曾经尝试过: > 正则表达式中的空格 Regex允许字母数字、空格和一些特殊字符 Java空间和换行正则表达式 我的正则表达式如下: 我只想在这里加一点空间。我试过和