NetworkOnMainThread在Android中使用AsyncSubject RxJava

时间:2016-11-23 10:21:03

标签: android rx-java rx-android

即使我在回复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”)));
}

1 个答案:

答案 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(...)