rx-java2 Schedulers.io () steel вызывает метод из mainThread

Я пытаюсь получить данные из базы данных, используя комнату с Rx способом. Вот как я пытаюсь это сделать

override fun onStart() { super.onStart() disposable.add(presenter.getAllBooks() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ println(it.size()) })) } 

это метод getAllBooks() внутри ведущего

 fun getAllBooks() : Flowable<List<Book>> { val isMainThread = Looper.myLooper() == Looper.getMainLooper() if (!isMainThread) { updateBooks() return db.bookDao().allBooks } return Flowable.empty() } 

Здесь переменная isMainThread всегда true , я также попробовал observeOn(Shcedulers.io()) , но та же проблема.

Это распространенное недоразумение с RxJava. getAllBooks выполняет свое содержание до того, как RxJava попадает в изображение.

 fun method() : Flowable<String> { println("method()") return Flowable.just("hello") } println("Preparing...") val f = method(); println("Subscribing...") f.subscribe({ println(it) }) 

Он будет печатать

 Preparing... method() Subscribing... hello 

Вы должны перенести свое действие в Flowable чтобы оно произошло, когда происходит подписка:

 disposable.add( Flowable.defer(() -> presenter.getAllBooks()) // <---------------------- .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ println(it.size()) }) ) 
Intereting Posts