首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NetworkOnMainThread在安卓系统中使用AsyncSubject RxJava

NetworkOnMainThread在安卓系统中使用AsyncSubject RxJava
EN

Stack Overflow用户
提问于 2016-11-23 10:21:02
回答 1查看 224关注 0票数 0

即使在返回的Observable.中应用调度程序时,也面临着AsyncSubject 上的AsyncSubject为什么我们需要在Schedulers上应用Subject

Subjects的javadocs中,我忽略了这个解释,如果我们不编写它,为什么Subject会出现在主线程中呢?有人能指出解释这一点的文档吗?

下面有一个代码示例来说明这个场景。

这是用例:

代码语言:javascript
复制
/*** 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;
}

这是演示者的代码:

代码语言:javascript
复制
private void onSearchButtonClicked(){
    searchUseCase.call(“let me google something”).compose(mBackgroundThreadTransformer.applySchedulers())
        .subscribe(searchResult -> show(searchResult),
            e -> Timber.d(e, "Failed to search”)));
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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(...)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40761668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档