日志:
.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3939)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4096)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2441)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:233)
at android.os.Looper.loop(Looper.java:334)
at android.app.ActivityThread.main(ActivityThread.java:8396)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:582)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1068)
Caused by: java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
at androidx.room.RoomDatabase.assertNotMainThread(RoomDatabase.java:469)
at androidx.room.RoomDatabase.beginTransaction(RoomDatabase.java:553)
at android.app.Activity.performCreate(Activity.java:8490)
at android.app.Activity.performCreate(Activity.java:8468)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1379)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3912)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4096)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2441)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:233)
at android.os.Looper.loop(Looper.java:334)
at android.app.ActivityThread.main(ActivityThread.java:8396)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:582)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1068)
解决方法:
1.在数据库对应的DataBase中使用.allowMainThreadQueries()来声明可以再主线程操作。
private fun createInstance(context: Context): StudentDataBase {
mInstance = Room.databaseBuilder(
context.applicationContext,
StudentDataBase::class.java,
DatabaseName
).allowMainThreadQueries().build()
return mInstance as StudentDataBase
}
2.开启一个子线程 在子线程中操作。