即使在 IO 线程上订阅,房间仍然在主线程上运行

Lv.*_*ian 5 android rx-java2 android-room

这是我的房间 DAO。

@Dao
interface ProgramListDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertAll(programList: List<Program>)

    @Query("SELECT * FROM program_list")
    fun loadAll(): List<Program>
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试调用此函数

override fun isQuestionsRepoEmpty(): Observable<Boolean> = 
Observable.fromCallable({ questionsDao.loadAll().isEmpty() })
Run Code Online (Sandbox Code Playgroud)

通过

compositeDisposable.add(it.seedOptions()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({
                getView()?.let { decideActivityToOpen() }
            }))
Run Code Online (Sandbox Code Playgroud)

在哪里

fun seedOptions(): Observable<Boolean> {

    return optionsRepoHelper.isOptionsRepoEmpty().concatMap { isEmpty ->
        if (isEmpty) {    
            optionsRepoHelper.insertOptions(optionsList)
        } else
            Observable.just(false)
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当调用 isOptionsRepoEmpty() 时出现此错误

java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
Run Code Online (Sandbox Code Playgroud)

我已经阅读了 StackOverflow 上的一些帖子,并将Observable.just()更改为Observable.fromCallable(),但是代码似乎仍在主线程上运行。

在这种情况下如何解决?

编辑 1:

这是复制异常的方法

存储库:https : //github.com/MindorksOpenSource/android-kotlin-mvp-architecture

SplashPresenter.kt 中,说我只想运行seedOption

private fun feedInDatabase() = interactor?.let {
    compositeDisposable.add(it.seedOptions()
            .compose(schedulerProvider.ioToMainObservableScheduler())
            .subscribe({
                getView()?.let { decideActivityToOpen() }
            }))
}
Run Code Online (Sandbox Code Playgroud)

但是应用程序因为这个变化而崩溃,因为数据库在主线程上运行。

我已将 this 函数从原来的 Observable.just() 改为Observable.fromCallable(),如下所示:

 override fun isOptionsRepoEmpty(): Observable<Boolean> = Observable.fromCallable({optionsDao.loadAll().isEmpty()})
Run Code Online (Sandbox Code Playgroud)