Jem*_*ili 1 android kotlin rx-android rx-java2 android-room
我正在尝试使用Rx方式使用房间从数据库中检索数据.这就是我试图这样做的方式
override fun onStart() {
super.onStart()
disposable.add(presenter.getAllBooks()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
println(it.size())
}))
}
Run Code Online (Sandbox Code Playgroud)
这是getAllBooks()演示者内部的方法
fun getAllBooks() : Flowable<List<Book>> {
val isMainThread = Looper.myLooper() == Looper.getMainLooper()
if (!isMainThread) {
updateBooks()
return db.bookDao().allBooks
}
return Flowable.empty()
}
Run Code Online (Sandbox Code Playgroud)
这里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) })
Run Code Online (Sandbox Code Playgroud)
它会打印出来
Preparing...
method()
Subscribing...
hello
Run Code Online (Sandbox Code Playgroud)
您必须将您的操作包装成a Flowable以在订阅发生时实现:
disposable.add(
Flowable.defer(() -> presenter.getAllBooks()) // <----------------------
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
println(it.size())
})
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
96 次 |
| 最近记录: |