2017-02-16 28 views
0

我正在將AsyncTaskLoader遷移到RxJava,試圖瞭解有關RxJava併發方法的所有細節。簡單的事情都運行正常,但我用下面的代碼掙扎:代碼在主線程上運行,即使指定了subscribeOn

這是一個被執行頂層方法:

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之前,源-aka-final層代碼不是來自RxJava世界,因此在調用createQuery之前不是事件。所以我可能需要某種包裝?我試過申請.fromCallable,然而這對非處方代碼的包裝,和我的數據庫層返回一個可觀察......

回答

3

Log.d調用發生

    立即
  • listStuff被調用
  • 這是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

相關問題