即使我在回复NetworkOnMainThreadException
中应用了调度程序,我在AsyncSubject
上也面临Observable
。
为什么我们需要在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”)));
}
答案 0 :(得分:2)
让我们分析一下这种行为。
从第一个未返回NetworkOnMainThreadException
的方法开始,您将调度程序应用于Observable
返回的mSearchWebService.call(searchQuery)
。这很清楚。
关于第二起案件的问题?您创建Subject
返回它并将调度程序应用于从函数返回的内容。返回Subject
并获取调度程序。 mSearchWebService.call(“let me google something”)
mBackgroundThreadTransformer
从Subject
的角度来看,mSearchWebService.call(...)
是什么?这是Subscriber
。所以mSearchWebService.call(...) ends (without assigning any particular
计划程序) passing the result to
主题(which runs on
mBackgroundThreadTransformer ) which passes the result to the end
订阅者。
解决方案:
明确地将Scheduler
应用于mSearchWebService.call(...)
。