这是我所拥有的房间。
@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()})