Android 无法访问runnable中主线程上的数据库

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)

房间出错:

java.lang.IllegalStateException:无法访问主线程上的数据库,因为它可能会长时间锁定UI

即使我正在创建新线程并对其运行查询,它也会给我上述错误

我的线程代码:

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()
}
}
  • 我的内部问题是什么
  • 为什么在我创建新线程时给出错误“它是主线程”
  • 改为使用AsyncTask。 e、 g

    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
    部分的目的。