我正在尝试使用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())
,但同样的问题。
答案 0 :(得分:7)
这是与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())
})
)