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

rx-java2 Schedulers.io() steel invokes method from mainThread

我正在尝试使用 room 和 Rx 方式从数据库中检索数据。 这就是我正在尝试的方式

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

这是 Presenter 中的 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())
            })
)