即使在返回的Observable.中应用调度程序时,也面临着AsyncSubject 上的AsyncSubject为什么我们需要在Schedulers上应用Subject
在Subjects的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”)));
}发布于 2016-11-23 14:02:34
我们来分析一下他们的行为。
从不返回NetworkOnMainThreadException的第一个方法中,将调度程序应用到mSearchWebService.call(searchQuery)返回的Observable。这很明显。
关于第二个案子呢?创建Subject,返回它,并将调度程序应用于函数返回的内容。返回Subject并获取调度程序。mSearchWebService.call(“let me google something”)不是由mBackgroundThreadTransformer安排的
从Subject的角度看,mSearchWebService.call(...)是什么?这是Subscriber。所以mSearchWebService.call(...) ends (without assigning any particularScheduler) passing the result toSubject(which runs onmBackgroundThreadTransformer) which passes the result to the endSubscriber`.
解决方案:显式地将Scheduler应用于mSearchWebService.call(...)。
https://stackoverflow.com/questions/40761668
复制相似问题