ich einen Code wie dieses:Verwalten von Thread-Scheduler, wenn concat Observablen
service.getUserById(10)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.concatMap(getFullUserFromDto())
.subscribe(doSomehingWithUser());
private Func1<UserDto, Observable<User>> getFullUserFromDto() {
return new Func1<UserDto, Observable<User>>() {
@Override
public Observable<User> call(final UserDto dto) {
return dao.getUserById(dto.getUserId());
}
};
}
und in meinem DAO, ich habe:
public Observable<User> getUserById(final Long id) {
return api.getUserById(id).map(//more things...
}
Hinweis gibt es zwei Ebenen der "Verkettung": service
- >dao
->api
. Methode api.getUserById(id)
einen Netzwerkanruf tätigen.
Ich bekomme NetworkOnMainThreadException
Fehler. Warum? Ich benutze und subscribeOn
und observeOn
Betreiber, aber es scheint, dass es nicht auf die "endgültige" gebaut Observable angewendet wird.
Wenn ich diese Operatoren in dem API-Aufruf verwenden, in der DAO, es funktioniert:
return api.getUserById(id)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.map(//more things...
Gibt es eine Möglichkeit nur einmal in der "root" Observable zu benutzen?
Ihr Fehler ist in 'api.getUserById (id)' und Sie beheben es durch 'api.getUserById (id) .subscribeOn (Schedulers.io())', was bedeutet, dass Sie Ihre Implementierung von 'API einschließen sollten .getUserById() '** – EpicPandaForce