Android 无法访问runnable中主线程上的数据库
房间出错: java.lang.IllegalStateException:无法访问主线程上的数据库,因为它可能会长时间锁定UI 即使我正在创建新线程并对其运行查询,它也会给我上述错误 我的线程代码:Android 无法访问runnable中主线程上的数据库,android,android-room,kotlin-android-extensions,Android,Android Room,Kotlin Android Extensions,房间出错: java.lang.IllegalStateException:无法访问主线程上的数据库,因为它可能会长时间锁定UI 即使我正在创建新线程并对其运行查询,它也会给我上述错误 我的线程代码: val thread = Runnable { val intent1 = Intent(activity!!, NewOrderActivity::class.java) intent1.putExtra("isReview", isReview)
val thread = Runnable {
val intent1 = Intent(activity!!, NewOrderActivity::class.java)
intent1.putExtra("isReview", isReview)
intent1.putExtra("editClicked", editClicked)
intent1.putExtra("orderId", orderId)
intent1.putExtra(ParamsUtils.connected, CommonUtils.isInNetwork(activity))
intent1.putExtra("orderName", orderName)
intent1.putExtra("order", Gson().toJson(orderItem))
intent1.putExtra("groupId", viewModel.getGroupId(orderItem.buyerId))
Handler().post {
startActivity(intent1)
activity!!.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out)
activity!!.finish()
}
}
thread.run()
请告诉我在哪里,我错了
编辑
我知道下面的方式,所以请不要评论。
我不想将活动引用传递给其他类,所以我在同一个类中使用线程
internal class NewOrderAsyncTask(activity: Activity, private val isReview: Boolean, private val editClicked: Boolean, private val orderId: Long, private val orderName: String, private val orderItem: OrderItem, private val dataManager: DataManager) : AsyncTask<Void, Void, String>() {
//Prevent leak
private val weakActivity: WeakReference<Activity> = WeakReference(activity)
override fun doInBackground(vararg params: Void): String {
return dataManager.getGroupId(orderItem.buyerId)
}
override fun onPostExecute(agentsCount: String) {
val activity = weakActivity.get() ?: return
val intent1 = Intent(activity!!, NewOrderActivity::class.java)
intent1.putExtra("isReview", isReview)
intent1.putExtra("editClicked", editClicked)
intent1.putExtra("orderId", orderId)
intent1.putExtra(ParamsUtils.connected, CommonUtils.isInNetwork(activity))
intent1.putExtra("orderName", orderName)
intent1.putExtra("order", Gson().toJson(orderItem))
intent1.putExtra("groupId", agentsCount)
activity.startActivity(intent1)
activity.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out)
activity.finish()
}
}
内部类NewOrderAsyncTask(activity:activity,private val isReview:Boolean,private val editClicked:Boolean,private val orderId:Long,private val orderName:String,private val orderItem:orderItem,private val dataManager:dataManager):AsyncTask(){
//防漏
私有val weakActivity:WeakReference=WeakReference(活动)
重写fun doInBackground(vararg参数:Void):字符串{
返回dataManager.getGroupId(orderItem.buyerId)
}
重写onPostExecute(agentCount:String){
val activity=weakActivity.get()?:返回
val intent1=Intent(activity!!,NewOrderActivity::class.java)
intent1.putExtra(“isReview”,isReview)
intent1.putExtra(“editClicked”,editClicked)
intent1.putExtra(“orderId”,orderId)
intent1.putExtra(ParamsUtils.connected、CommonUtils.isInNetwork(活动))
intent1.putExtra(“orderName”,orderName)
intent1.putExtra(“order”,Gson().toJson(orderItem))
intent1.putExtra(“groupId”,agentCount)
活动。开始触觉(意图1)
activity.overridePendingTransition(android.R.anim.fade\u-in,android.R.anim.fade\u-out)
activity.finish()
}
}
class myTask():AsyncTask(){
重写fun doInBackground(vararg参数:Void?):字符串{
// ...
}
覆盖乐趣onPreExecute(){
super.onPreExecute()
// ...
}
重写onPostExecute(结果:字符串?){
super.onPostExecute(结果)
// ...
}
}
周围有好几处
编辑:不知道代码的其余部分,但请尝试在doInBackground
部分中进行连接,然后通过其参数将新活动的所需值传递给onpostexquete
部分改用AsyncTask。
e、 g
class myTask():AsyncTask(){
重写fun doInBackground(vararg参数:Void?):字符串{
// ...
}
覆盖乐趣onPreExecute(){
super.onPreExecute()
// ...
}
重写onPostExecute(结果:字符串?){
super.onPostExecute(结果)
// ...
}
}
周围有好几处
编辑:不知道代码的其余部分,但请尝试在
doInBackground
部分中进行连接,然后通过其参数将新活动的所需值传递给onpostexquete
部分所有任务,如从internet加载内容,从存储器中获取数据必须在AsyncTask中完成,而不是在UI线程上完成
创建一个类
public class MyCLass extends AsyncTask
您可以创建一个函数来访问此类中的数据库。在UI线程中,创建该类的对象并调用您创建的函数。internet上有许多有关AsyncTask的教程。所有任务(如从internet加载内容、从存储器中获取数据)都必须在AsyncTask中完成,而不是在UI线程中完成 创建一个类
public class MyCLass extends AsyncTask
您可以创建一个函数来访问此类中的数据库。在UI线程中,创建该类的对象并调用您创建的函数。internet上有许多有关AsyncTask的教程。您想创建一个新的。相反,您创建了一个,因此运行它意味着在主线程上运行
当然,调用变量“thread”并不能使其成为线程。这将更有意义:
val runnable = Runnable { //runnable code }
可能尝试创建一个新线程并重写run方法(java中的示例):
您想创建一个新的。相反,您创建了一个,因此运行它意味着在主线程上运行
当然,调用变量“thread”并不能使其成为线程。这将更有意义:
val runnable = Runnable { //runnable code }
可能尝试创建一个新线程并重写run方法(java中的示例):
我已将
Runnable
包装到线程中
:
val intent1 = Intent(activity, NewOrderActivity::class.java).apply {
putExtra("isReview", isReview)
putExtra("editClicked", editClicked)
putExtra("orderId", orderId)
putExtra(ParamsUtils.connected, CommonUtils.isInNetwork(activity))
putExtra("orderName", orderName)
putExtra("order", Gson().toJson(orderItem))
putExtra("groupId", viewModel.getGroupId(orderItem.buyerId))
}
val thread = Thread(Runnable {
Handler().post {
startActivity(intent1)
activity?.overridePendingTransition(
android.R.anim.fade_in,
android.R.anim.fade_out
)
activity?.finish()
}
})
thread.start()
我已将
Runnable
包装到线程中
:
val intent1 = Intent(activity, NewOrderActivity::class.java).apply {
putExtra("isReview", isReview)
putExtra("editClicked", editClicked)
putExtra("orderId", orderId)
putExtra(ParamsUtils.connected, CommonUtils.isInNetwork(activity))
putExtra("orderName", orderName)
putExtra("order", Gson().toJson(orderItem))
putExtra("groupId", viewModel.getGroupId(orderItem.buyerId))
}
val thread = Thread(Runnable {
Handler().post {
startActivity(intent1)
activity?.overridePendingTransition(
android.R.anim.fade_in,
android.R.anim.fade_out
)
activity?.finish()
}
})
thread.start()
我不熟悉kotlin,但是您确定您没有声明一个可运行的命名线程,而不是实际创建一个内部有可运行线程的新线程吗?在普通java中,线程将用start()而不是run()调用。我正在用RunnableIt创建新线程。如果它是一个线程,则应该调用thread.start()或thread.run()。thread.start()将在创建新线程后调用run()。onPostExecute在主线程中完成,这就是为什么会出现错误我对kotlin不熟悉,但您确定您没有声明可运行的命名线程,而不是实际创建内部具有可运行的新线程吗?在普通java中,线程将用start()而不是run()调用。我正在用RunnableIt创建新线程。如果它是一个线程,则应该调用thread.start()或thread.run()。创建新线程后,thread.start()将调用run()。onPostExecute在主线程中完成,这就是为什么会在主线程中执行错误
onPostExecute
,因此无法在那里进行连接。这就是doInBackground
部分的目的。onPostExecute
在主线程中执行,因此不能在那里进行连接。这就是doInBackground
部分的目的。