我的协同程序在主线程上运行,这是我在协同程序上下文中指定的:
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.database?.clearAllTables()
到我的Room
数据库。
这里是我的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()
}
如果我的协同程序上下文在主线程上运行,为什么仍然会出现错误?
您好,这个问题是因为数据库必须在主线程上运行。因此,您必须将这行代码添加到数据库部分
Room.databaseBuilder(context.getApplicationContext(),
DataBaseTextChat.class, Constants.DB_TEXT_CHAT)
.allowMainThreadQueries()
.addCallback(roomCallBack).build();
你不能使用调度器。Main
用于长时间运行的任务。你必须使用调度器。IO
对于数据库操作,如下所示:
class ClickPreference(context: Context, attrs: AttributeSet) : Preference(context, attrs), CoroutineScope, View.OnClickListener {
override val coroutineContext: CoroutineContext
get() = Dispatchers.IO
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)
}
}
}
错误表示它不应该在主线程上运行。数据库操作(以及其他形式的IO)可能需要很长时间,应该在后台运行。
你应该使用调度员。IO
是为运行IO操作而设计的。
在主活动中,我有LiveData,其中包含成员和单击侦听器。如果我点击一个成员,那么他的ID将通过intent.putExtra。该ID稍后会传递给在此活动中打开的方法。有了这个活动,我想看看一个会员的详细情况。在我的MemberInfo活动中,我标出了我的问题所在的一行。它显示了这个错误:无法访问主线程上的数据库,因为它可能会锁定用户界面很长一段时间。 我的DAO由以下代码组成: 这是我的主要活
我的Coroutine运行在主线程上,我在Coroutine上下文中指定了主线程: 以下是我的: 如果我的coroutine上下文运行在主线程上,为什么我仍然得到错误?
我得到了一个著名的错误但根据我的理解,我没有访问主线程中的数据库,因为我正在执行由ThreadPoolExecutor执行的Runnable中的调用。我做错了什么? 在下面的方法中,我使用runnable从网络获取数据并将其存储在本地数据库中。 数据源.保存: 执行人定义为:
在“我的活动”中实现了以下功能: 不幸的是,在执行上面的方法时,它会与下面的堆栈跟踪崩溃: 这个问题似乎与主线程上db操作的执行有关。但是,上面链接中提供的示例测试代码并不在单独的线程上运行:
本文向大家介绍C#多线程与跨线程访问界面控件的方法,包括了C#多线程与跨线程访问界面控件的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#多线程与跨线程访问界面控件的方法。分享给大家供大家参考。具体分析如下: 在编写WinForm访问WebService时,常会遇到因为网络延迟造成界面卡死的现象。启用新线程去访问WebService是一个可行的方法。 典型的,有下面的启动新线程示例