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

“无法访问主线程上的数据库,因为它可能会在很长一段时间内锁定UI。”我的Coroutine出现错误

陶俊晤
2023-03-14

我的Coroutine运行在主线程上,我在Coroutine上下文中指定了主线程:

class ClickPreference(context: Context, attrs: AttributeSet) : Preference(context, attrs), CoroutineScope, View.OnClickListener {

    override val coroutineContext: CoroutineContext
        get() = Dispatchers.Main

override fun onClick(v: View?) {
    when (key){
        "logout" -> {
            CoroutineScope(coroutineContext).launch {
                CustomApplication.database?.clearAllTables()
                Log.d("MapFragment", "Cleared Tables")
            }
            if (Profile.getCurrentProfile() != null) LoginManager.getInstance().logOut()
            FirebaseAuth.getInstance().signOut()
            val intent = Intent(context, MainActivity::class.java)
            context.startActivity(intent)
        }
    }
}
java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.

以下是我的CustomApplication:

class CustomApplication : Application() {

    companion object {
        var database: AppDatabase? = null
    }

    override fun onCreate() {
        super.onCreate()
        CustomApplication.database = Room.databaseBuilder(this, AppDatabase::class.java, "AppDatabase").build()
    }

如果我的coroutine上下文运行在主线程上,为什么我仍然得到错误?

共有1个答案

上官自明
2023-03-14

错误表示它不应该在主线程上运行。数据库操作(以及每种其他形式的IO)可能需要很长时间,并且应该在后台运行。

您应该使用dispatchers.IO,它是为运行IO操作而设计的。

 类似资料:
  • 我的协同程序在主线程上运行,这是我在协同程序上下文中指定的: 但我还是犯了这个错误: 在我上面的协程调用到我的数据库。 这里是我的: 如果我的协同程序上下文在主线程上运行,为什么仍然会出现错误?

  • 在主活动中,我有LiveData,其中包含成员和单击侦听器。如果我点击一个成员,那么他的ID将通过intent.putExtra。该ID稍后会传递给在此活动中打开的方法。有了这个活动,我想看看一个会员的详细情况。在我的MemberInfo活动中,我标出了我的问题所在的一行。它显示了这个错误:无法访问主线程上的数据库,因为它可能会锁定用户界面很长一段时间。 我的DAO由以下代码组成: 这是我的主要活

  • 我得到了一个著名的错误但根据我的理解,我没有访问主线程中的数据库,因为我正在执行由ThreadPoolExecutor执行的Runnable中的调用。我做错了什么? 在下面的方法中,我使用runnable从网络获取数据并将其存储在本地数据库中。 数据源.保存: 执行人定义为:

  • 我在20分钟前问过这个问题,但当我插入代码时,站点需要很长时间才能加载。10分钟后,我收到以下错误消息: 使用以下代码:

  • 在“我的活动”中实现了以下功能: 不幸的是,在执行上面的方法时,它会与下面的堆栈跟踪崩溃: 这个问题似乎与主线程上db操作的执行有关。但是,上面链接中提供的示例测试代码并不在单独的线程上运行:

  • 问题内容: 我需要重新启动数据库,因为某些进程无法正常工作。我的计划是使它脱机并再次回到联机状态。 我正在尝试在Sql Server Management Studio 2008中执行此操作: 我收到这些错误: 我究竟做错了什么? 问题答案: 得到错误后,运行 在列表中查找数据库。连接可能没有终止。如果找到与数据库的任何连接,请运行 连接到数据库的会话的SPID在哪里。 删除所有与数据库的连接后,