【问题标题】:RX android Single<Boolean> not subscribing to Schedulers.io() thread but to main thread instead when doing ROOM queryRX android Single<Boolean> 在进行 ROOM 查询时不订阅 Schedulers.io() 线程而是订阅主线程
【发布时间】: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


【解决方案1】:

更正您的方法checkContactExists,如下所示。它会起作用的。

override fun checkContactExists(number: Long): Single<Boolean> {
    return Single.fromCallable{
         database.ContactsDao().exists(number)
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多