rx-java2 Schedulers.io()steel从mainThread调用方法

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()),但同样的问题.

aka*_*okd 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) })
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)