Я использую Retrofit и RxJava для выполнения некоторых фоновых задач. Код выглядит следующим образом:Как выполнить flatMap на фоновом потоке
public class MyLoader{
public Observable<MyData> getMyData(){
return setupHelper().flatMap(new Func1<MyHelper, Observable<MyData>>() {
@Override
public Observable<MyData> call(MyHelper myHelper) {
return queryData(myHelper);
}
});
}
private Observable<MyData> queryData(MyHelper myHelper){
...
}
private Observable<MyHelper> setupHelper(){
return Observable.create(new Observable.OnSubscribe<MyHelper>() {
@Override
public void call(final Subscriber<? super MyHelper> subscriber) {
try{
MyHelper helper = makeRetrofitCall();//Using Retrofit blocking call to get some data
subscriber.onNext(helper);
subscriber.onCompleted();
}catch(RetrofitError e){
subscriber.onError(e)
}
}
}
}
}
Это терпит неудачу с RetrofitError, из-за NetworkOnMainThread
Исключение в этой строке:
MyHelper helper = makeRetrofitCall();//Using Retrofit blocking call to get some data
подписавшись на мой Observable:
myLoader.getMyData()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<MyData>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(MyData inventory) {
}
});
Согласно Rx документации flatMap
Безразлично работайте с любым фоновым потоком. Мой вопрос заключается в том, как обеспечить, чтобы весь метод getMyData()
выполнялся в фоновом режиме.
На первый взгляд, я не вижу ничего плохого. Не могли бы вы попытаться поставить '.subscribeOn (Schedulers.io())' в 'setupHelper' вместо этого? – akarnokd
Дооснащение уже интегрировано с RxJava и способно напрямую возвращать Observables, поэтому вам не нужно создавать собственные наблюдательные команды, выполняющие запросы. – BladeCoder
Вы нашли другой подход, чем добавление '.subscribeOn()' во втором наблюдаемом? – Juancho