2016-11-23 50 views
0

我面對一個AsyncSubject一個NetworkOnMainThreadException,甚至當我在返回Observable應用調度。 爲什麼我們需要在Subject上應用SchedulersNetworkOnMainThread使用AsyncSubject RxJava Android中

我錯過了在的javadocs中的這個解釋,爲什麼Subject如果我們不構成它的主線程?有人可以指出一個文件解釋這個?

下面的代碼示例說明了這種情況。

這是用例:

/*** Makes a network call to retrieve a search result, it returns an Observable<SearchResult> */ 
private Observable<SearchResult> call(String searchQuery){ 
    return mSearchWebService.call(searchQuery); 
} 

/* Same code but with a a NetworkOnMainThreadException */ 
private Observable<SearchResult> call(String searchQuery){ 
    final Subject<SearchResult, SearchResult> subject = AsyncSubject.create(); 
    mSearchWebService.call(「let me google something」) 
      .subscribe(subject::onNext, subject::onError, subject::onCompleted); 
    // When we apply the schedulers in the subject, it works fine, but why it doesn’t apply the schedulers of the observables? 
    // This works: mSearchWebService.call(「let me google something」) 
    // .compose(mBackgroundThreadTransformer.applySchedulers()) 
    // .subscribe(subject::onNext, subject::onError, subject::onCompleted); 
    return subject; 
} 

這是演示代碼:

private void onSearchButtonClicked(){ 
    searchUseCase.call(「let me google something」).compose(mBackgroundThreadTransformer.applySchedulers()) 
     .subscribe(searchResult -> show(searchResult), 
      e -> Timber.d(e, "Failed to search」))); 
} 

回答

1

讓我們來分析行爲。

從不返回NetworkOnMainThreadException的第一種方法將調度程序應用到由mSearchWebService.call(searchQuery)返回的Observable。這很清楚。

Whaat關於第二個案例?您創建Subject返回它並將調度程序應用於函數返回的內容。返回Subject並獲取調度程序。 mSearchWebService.call(「let me google something」)不安排mBackgroundThreadTransformer

什麼是SubjectmSearchWebService.call(...)的角度?它是Subscriber。所以mSearchWebService.call(...) ends (without assigning any particular排程器) passing the result to主題(which runs on mBackgroundThreadTransformer ) which passes the result to the end Subscriber`。

解決方案: 明確應用SchedulermSearchWebService.call(...)