【发布时间】:2021-03-09 10:25:21
【问题描述】:
我在使用 android RX 方面不是很有经验。我正在使用query检查实体是否在 ROOM 中退出
这是在我的 DAO 中
@Query("SELECT EXISTS(SELECT * FROM contacts WHERE number = :phoneNumber)")
fun exists(phoneNumber: Long) : Boolean
这是在我的 RepoImpl 中
override fun checkContactExists(number: Long): Single<Boolean> {
val exists = database.ContactsDao().exists(number)
return Single.fromCallable{
exists
}
}
我称之为这样的演示者:
repo.checkContactExists(number)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : DisposableSingleObserver<Boolean>(){
override fun onSuccess(exists: Boolean) {
Log.d(TAG, "contacts exists $exists")
if (exists) {
....
} else {
....
}
}
override fun onError(e: Throwable) {
Log.e(TAG, "failed to check if number exists ${e.message}")
}
})
当我调用它时,我得到了这个异常
2021-03-09 10:22:04.052 13966-13966/com.umony.radar E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.umony.radar, PID: 13966
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:261)
at androidx.room.RoomDatabase.query(RoomDatabase.java:303)
at androidx.room.util.DBUtil.query(DBUtil.java:54)
谁能帮我理解为什么当我有subscribeOn(Schedulers.io())时查询会在主线程上执行
【问题讨论】:
-
您正在主线程上调用并在 IO() 线程上返回布尔值。这没有意义吗?
标签: android mobile android-room rx-android