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

时间:2018-03-10 09:33:13

标签: android rx-java2 android-room

这是我所拥有的房间。

@Dao
interface ProgramListDao {

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

    @Query("SELECT * FROM program_list")
    fun loadAll(): List<Program>
}

我试图调用此函数

override fun isQuestionsRepoEmpty(): Observable<Boolean> = 
Observable.fromCallable({ questionsDao.loadAll().isEmpty() })

经由

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

其中

fun seedOptions(): Observable<Boolean> {

    return optionsRepoHelper.isOptionsRepoEmpty().concatMap { isEmpty ->
        if (isEmpty) {    
            optionsRepoHelper.insertOptions(optionsList)
        } else
            Observable.just(false)
    }
}

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

java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.

我已经阅读了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() }
            }))
}

但由于此更改导致应用程序崩溃,因为数据库在主线程上运行。

我已将此功能从原始Observable.just()更改为Observable.fromCallable(),如下所示:

 override fun isOptionsRepoEmpty(): Observable<Boolean> = Observable.fromCallable({optionsDao.loadAll().isEmpty()})

0 个答案:

没有答案