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

时间:2017-11-13 14:05:22

标签: 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())
              }))
}

这是演示者内部的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()),但同样的问题。

1 个答案:

答案 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())
            })
)