2016-11-23 5 views
0

я обращенный к NetworkOnMainThreadException на AsyncSubjectдаже тогда, когда я применяю планировщик в возвращающей Observable. Зачем нам нужно использовать Schedulers на Subject?NetworkOnMainThread использования AsyncSubject RxJava в Android

Я пропустил это объяснение в javadocs от Subjects, почему 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, вы применяете планировщики к Observable, указанному mSearchWebService.call(searchQuery). Это понятно.

Whaat о втором случае? Вы создаете Subject, чтобы вернуть его и применить планировщики к тому, что возвращается из функции. Возвращается Subject и получает планировщики. mSearchWebService.call(“let me google something”) не планироваться mBackgroundThreadTransformer

Что Subject с точки зрения mSearchWebService.call(...)? Это Subscriber. So 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(...) явно.

Смежные вопросы