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
,然而這對非處方代碼的包裝,和我的數據庫層返回一個可觀察......
謝謝!我感到困惑和過於複雜的事情非常簡單。 – vkislicins