无法在可运行的主线程上访问数据库

Cannot access database on the main thread in runnable

房间报错:

java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.

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

我的线程代码:

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()

请指点我哪里错了

编辑

我知道下面的方法,所以请不要发表评论。 我不想将 activity 引用传递给其他 class,所以我在同一个 class.

中使用线程
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()
    }
}
  1. 我的内部线程有什么问题?
  2. 为什么在我创建新线程时出错,"It is main thread"?

改为使用 AsyncTask。 例如

class myTask() : AsyncTask<Void, Void, String>() {
    override fun doInBackground(vararg params: Void?): String? {
        // ...
    }

    override fun onPreExecute() {
        super.onPreExecute()
        // ...
    }

    override fun onPostExecute(result: String?) {
        super.onPostExecute(result)
        // ...
    }
}

周围有几个examples

编辑: 不知道你的代码的其余部分,但尝试在 doInBackground 部分进行连接,然后传递新的所需值activity 通过其参数

onPostExequte 部分

从 Internet 加载内容、从存储中获取数据等所有任务都必须在 AsyncTask 中完成,而不是在 UI 线程上完成。

创建 class

public class MyCLass extends AsyncTask

您可以在此 class 中创建一个访问数据库的函数。在 UI 线程中,创建一个 class 的对象并调用您创建的函数。互联网上有很多 AsyncTask 教程。

您想创建一个新的 Thread. Instead you created a Runnable,因此 运行ning 意味着 运行ning 在主线程上。

调用变量 'thread' 当然不会使其成为线程。这会更有意义:

val runnable = Runnable { //runnable code }

也许尝试创建一个新线程并覆盖 运行 方法(java 中的示例):

Thread thread = new Thread() {
    @Override
    public void run() {
        //your code
    }
};

thread.start();

我已经将 Runnable 包装成 Thread:

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()