2017-11-13 9 views
1

Rxの方法でデータベースからデータを取得しようとしています。 は、これは私がrx-java2 Schedulers.io()スチールはmainThreadのメソッドを呼び出します

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

が、これはプレゼンター

fun getAllBooks() : Flowable<List<Book>> { 
    val isMainThread = Looper.myLooper() == Looper.getMainLooper() 
    if (!isMainThread) { 
     updateBooks() 
     return db.bookDao().allBooks 
    } 
    return Flowable.empty() 
} 

内部getAllBooks()方法であることをやろうとしている方法です。ここisMainThread変数は、私もobserveOn(Shcedulers.io())が、同じ問題を試してみましたが、常にtrue、 です。

+0

を、あなたはLiveDataを使用してみてください。それはrx javaに似ていますが、そのライフサイクルを認識し、最もクールなものが部屋をサポートしています – Jois

+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) }) 

それはあなたがサブスクリプションが発生したときに、それを実現するためにFlowableにあなたの行動をラップする必要が

Preparing... 
method() 
Subscribing... 
hello 

印刷します:ただの提案

disposable.add(
    Flowable.defer(() -> presenter.getAllBooks()) // <---------------------- 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe({ 
       println(it.size()) 
      }) 
) 
+0

@ JemoMgebrishviliもちろん、あなたは 'defer' _inside_' getAllBooks() 'を実行することもできます。 –

関連する問題