无法在可运行的主线程上访问数据库
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()
}
}
- 我的内部线程有什么问题?
- 为什么在我创建新线程时出错,"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()
房间报错:
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()
}
}
- 我的内部线程有什么问题?
- 为什么在我创建新线程时出错,"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()