2017-02-16 14 views
0

AsyncTaskLoaderをRxJavaに移行する過程で、RxJavaの並行性のアプローチに関する詳細をすべて理解しようとしています。subscribeOnが指定されていても、メインスレッドでコードが実行されています

これが実行されます、トップレベルのメソッドです::シンプルなものはOK、しかし、私は次のコードで苦労しています実行していた

mCompositeDisposable.add(mDataRepository 
      .getStuff() 
      .subscribeOn(mSchedulerProvider.io()) 
      .subscribeWith(...) 

mDataRepository.getStuffは()次のようになります。

public Observable<StuffResult> getStuff() { 
    return mDataManager 
      .listStuff() 
      .flatMap(stuff -> Observable.just(new StuffResult(stuff))) 
      .onErrorReturn(throwable -> new StuffResult(null)); 

そして最終層:上記のコードを持つので

public Observable<Stuff> listStuff() { 
     Log.d(TAG, ".listStuff() - "+Thread.currentThread().getName()); 
     String sql = <...>; 
     return mBriteDatabase.createQuery(Stuff.TABLE_NAME, sql).mapToList(mStuffMapper); 
} 

log.listStuff() - mainを印刷しますが、これは私が探しているものではありません。そして、なぜ私は本当にわからない。 subscribeOnを設定すると、チェーンから引き出されたすべてのイベントは、subscribeOnメソッドで指定されたスレッドで処理されるという印象を受けました。

私が考えているのは、mBriteDatabaseに達する前の元の最終層のコードは、RxJavaの世界ではないため、createQueryが呼び出されるまでイベントではないということです。だから私はおそらく何らかの種類のラッパーが必要でしょうか?しかし私は、それが非Rxのコードのラッパーだ、と私のデータベース層が観測を返すlistStuffがある

  • 呼び出されたときに...

  • 答えて

    3

    あなたLog.dコールがすぐ

    • 起こる、.fromCallableを適用しようとしましたgetStuffが呼び出された直後
    • これはトップレベルのコードフラグメントで最初に起こったことです。

    サブスクリプションが発生したときにそれを実行する必要がある場合は、明示的にする必要があります。

    public Observable<Stuff> listStuff() { 
        String sql = <...>; 
        return mBriteDatabase.createQuery(Stuff.TABLE_NAME, sql) 
         .mapToList(mStuffMapper) 
         .doOnsubscribe(() -> Log.d(TAG, ".listStuff() - "+Thread.currentThread().getName())); 
    } 
    
    +0

    ありがとうございます!私は混乱し、何かが本当にシンプルすぎるほど複雑すぎる。 – vkislicins

    関連する問題