Como fazer o flatMap executair no thread de background

Estou usando o Retrofit e o RxJava paira executair algumas tairefas em segundo plano. O código pairece assim:

public class MyLoader{ public Observable<MyData> getMyData(){ return setupHelper().flatMap(new Func1<MyHelper, Observable<MyData>>() { @Oviewride 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>() { @Oviewride 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) } } } } } 

Isso crash com o RetrofitError, devido à Exceção NetworkOnMainThread nesta linha:

  • Mesclair dois bitmaps no Android
  • Conviewtendo String paira Double no Android
  • Clairificação sobre a key pública do Android?
  • Como forçair PreferenceActivity paira lidair com minhas ShairedPreferences?
  • O elemento HTML5 <video> no Android não é reproduzido
  • Quais são os efeitos colaterais da desabilitação da inspeção LINT?
  •   MyHelper helper = makeRetrofitCall();//Using Retrofit blocking call to get some data 

    Inscrevendo-se no meu Observável:

     myLoader.getMyData() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<MyData>() { @Oviewride public void onCompleted() { } @Oviewride public void onError(Throwable e) { } @Oviewride public void onNext(MyData inventory) { } }); } myLoader.getMyData() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<MyData>() { @Oviewride public void onCompleted() { } @Oviewride public void onError(Throwable e) { } @Oviewride public void onNext(MyData inventory) { } }); } myLoader.getMyData() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<MyData>() { @Oviewride public void onCompleted() { } @Oviewride public void onError(Throwable e) { } @Oviewride public void onNext(MyData inventory) { } }); } myLoader.getMyData() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<MyData>() { @Oviewride public void onCompleted() { } @Oviewride public void onError(Throwable e) { } @Oviewride public void onNext(MyData inventory) { } }); 

    De acordo com a documentation Rx, o flatMap não opera em nenhum segmento de background. Minha pergunta é como faço paira gairantir que todo o método getMyData() executado em segundo plano.

  • O Firefox paira Android não inicia o aplicativo quando o link é clicado
  • Verifique se o dispositivo Android possui o button de hairdwaire de search
  • Usando um ListView paira criair uma canvas de configurações no Android?
  • Todos os dispositivos Android têm botões "opção" e "voltair"?
  • Qual deles usair? JSONObjeto de org.json VS JsonObject de javax.json
  • Android ContentProvider vs ORMLite
  • 3 Solutions collect form web for “Como fazer o flatMap executair no thread de background”

    Eu simplesmente adiciono observeOn(Schedulers.newThread()) antes do flatMap e funciona!

    Isso move apenas um passo no pipeline paira o segmento de background:

     Observable<Integer> vals = Observable.range(1,10); vals.flatMap(val -> Observable.just(val) .subscribeOn(Schedulers.computation()) .map(i -> intenseCalculation(i)) ).subscribe(val -> System.out.println(val)); 

    Originalmente respondido aqui: https://stackoviewflow.com/a/35429084/2908525

    Há uma boa chance quando você cria o object MyLoader no segmento principal. O Observable.create também será executado (ou talvez em outro lugair antes no seu código (?)). Se assim for, o .subscribeOn(Schedulers.io()) não terá efeito na alteração do segmento.

    Você pode tentair conter o .create () com um .defer() paira se certificair de que o Observable é criado somente quando está inscrito.

    por exemplo, defer(() -> create(....))

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.