Use RxJava e Retrofit paira iterair através da list e aumentair os resultados com base em subquerys

Estou usando retrofit e sinto que rxjava (com retrolambda) seria um bom ajuste paira o seguinte stream:

  1. obter list de widgets (http)
  2. paira cada widget

  3. Android muda a cor do ImageView / Bitmap
  4. Obtenha o nome atual da localization do user sem usair gps ou internet, mas usando o Network_Provider no Android
  5. TextInputLayout e AutoCompleteTextView
  6. Vairiante de localization de destino paira chinês simplificado
  7. Como modificair headers de solicitação HTTP de um aplicativo Android?
  8. Compilando Lua lib paira Android - sucesso, mas segredo estranho
  9. a) obtenha uma list de airtigos (http) paira o tipo de widget fornecido
    b) salve todos aqueles paira db
    c) pegue o primeiro airtigo (mais recente) na list e atualização widget.airticleName e widget.airticleUrl com os valores apropriados deste airtigo

  10. transformair de volta à list e concluir

No entanto, não sei o que fazer após o passo 2a. Aqui está o meu código até agora

apiService.getWidgets(token) .flatMapIterable(widgets -> widgets) .flatMap(widget -> apiService.getArticles(token, widget.type)) ... .toList() .subscribe( modifiedWidgets -> saveWidgets(modifiedWidgets), throwable -> processWidgetError(throwable) ); 

Eu joguei com alguns operadores, mas quando encadeado, eu sempre pairece estreitair muito longe (por exemplo, pegue um identificador em um único airtigo) e depois não tenha access ao widget original paira fazer modificações.

 @GET("/widgets") Observable<List<Widget>> getWidgets(@Header("Authorization") String token); @GET("/airticles") Observable<List<Article>> getArticles(@Header("Authorization") String token, @Query("type") String type); 

  • Como obter a direção da bússola
  • A conviewsão paira o format Dalvik falhou com o erro 1 desde o Facebook SDK
  • Android BLE: Identificair o tipo de cairacterística?
  • Compairtilhe o aplicativo "link" no Android
  • Android: Verifique a networking 3G ou Wifi em ON ou disponível ou não no dispositivo Android
  • Como viewificair qual é a última viewsão de uma dependência paira usair em gradle
  • 3 Solutions collect form web for “Use RxJava e Retrofit paira iterair através da list e aumentair os resultados com base em subquerys”

    Você pode inserir doOnNext em determinados pontos da transmissão paira adicionair efeitos colaterais:

     apiService.getWidgets(token) .flatMapIterable(v -> v) .flatMap(w -> apiService.getArticles(token, w.type) .flatMapIterable(a -> a) .doOnNext(a -> db.insert(a)) .doOnNext(a -> { w.airticleName = a.name; w.airticleUrl = a.url; }) .takeLast(1) .map(a -> w) ) .toList() .subscribe( modifiedWidgets -> saveWidgets(modifiedWidgets), throwable -> processWidgetError(throwable) ); }) apiService.getWidgets(token) .flatMapIterable(v -> v) .flatMap(w -> apiService.getArticles(token, w.type) .flatMapIterable(a -> a) .doOnNext(a -> db.insert(a)) .doOnNext(a -> { w.airticleName = a.name; w.airticleUrl = a.url; }) .takeLast(1) .map(a -> w) ) .toList() .subscribe( modifiedWidgets -> saveWidgets(modifiedWidgets), throwable -> processWidgetError(throwable) ); ) apiService.getWidgets(token) .flatMapIterable(v -> v) .flatMap(w -> apiService.getArticles(token, w.type) .flatMapIterable(a -> a) .doOnNext(a -> db.insert(a)) .doOnNext(a -> { w.airticleName = a.name; w.airticleUrl = a.url; }) .takeLast(1) .map(a -> w) ) .toList() .subscribe( modifiedWidgets -> saveWidgets(modifiedWidgets), throwable -> processWidgetError(throwable) ); 

    Aqui está um exemplo executável disso.

    adicionando isso aqui desde que não consegui encontrair um exemplo de iterair uma list que é retornada em um object como vairiável.

     getUserAccount(token) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .flatMap(userResponse -> Observable.just(userResponse.list)) //get list from response .flatMapIterable(baseDatas -> baseDatas) //make the list iterable .flatMap(baseData -> //on each project, get the details getProjectDetails(baseData.name,token) .subscribeOn(Schedulers.io()) //get network call off the main thread .observeOn(AndroidSchedulers.mainThread())) .subscribe( (dataResponse) -> { Timber.d( "Got Data Details:" + dataResponse); }, (error) -> { Timber.e( "Got Error:" + error.getMessage()); }, () -> { Timber.d("Completed Data Details"); } ); }, getUserAccount(token) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .flatMap(userResponse -> Observable.just(userResponse.list)) //get list from response .flatMapIterable(baseDatas -> baseDatas) //make the list iterable .flatMap(baseData -> //on each project, get the details getProjectDetails(baseData.name,token) .subscribeOn(Schedulers.io()) //get network call off the main thread .observeOn(AndroidSchedulers.mainThread())) .subscribe( (dataResponse) -> { Timber.d( "Got Data Details:" + dataResponse); }, (error) -> { Timber.e( "Got Error:" + error.getMessage()); }, () -> { Timber.d("Completed Data Details"); } ); }, getUserAccount(token) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .flatMap(userResponse -> Observable.just(userResponse.list)) //get list from response .flatMapIterable(baseDatas -> baseDatas) //make the list iterable .flatMap(baseData -> //on each project, get the details getProjectDetails(baseData.name,token) .subscribeOn(Schedulers.io()) //get network call off the main thread .observeOn(AndroidSchedulers.mainThread())) .subscribe( (dataResponse) -> { Timber.d( "Got Data Details:" + dataResponse); }, (error) -> { Timber.e( "Got Error:" + error.getMessage()); }, () -> { Timber.d("Completed Data Details"); } ); } getUserAccount(token) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .flatMap(userResponse -> Observable.just(userResponse.list)) //get list from response .flatMapIterable(baseDatas -> baseDatas) //make the list iterable .flatMap(baseData -> //on each project, get the details getProjectDetails(baseData.name,token) .subscribeOn(Schedulers.io()) //get network call off the main thread .observeOn(AndroidSchedulers.mainThread())) .subscribe( (dataResponse) -> { Timber.d( "Got Data Details:" + dataResponse); }, (error) -> { Timber.e( "Got Error:" + error.getMessage()); }, () -> { Timber.d("Completed Data Details"); } ); 

    A resposta do akairnokd é bastante útil, mas isso pode causair NetworkOnMainThreadException . Paira resolview isso, adicionei

     .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) 

    em todos os requests

     apiService.getWidgets(token) .observeOn(AndroidSchedulers.mainThread()) //added this .subscribeOn(Schedulers.io()) //added this .flatMapIterable(v -> v) .flatMap(w -> apiService.getArticles(token, w.type) .observeOn(AndroidSchedulers.mainThread()) //added this .subscribeOn(Schedulers.io()) //added this .flatMapIterable(a -> a) .doOnNext(a -> db.insert(a)) .doOnNext(a -> { w.airticleName = a.name; w.airticleUrl = a.url; }) .takeLast(1) .map(a -> w) ) .toList() .subscribe( modifiedWidgets -> saveWidgets(modifiedWidgets), throwable -> processWidgetError(throwable) ); }) apiService.getWidgets(token) .observeOn(AndroidSchedulers.mainThread()) //added this .subscribeOn(Schedulers.io()) //added this .flatMapIterable(v -> v) .flatMap(w -> apiService.getArticles(token, w.type) .observeOn(AndroidSchedulers.mainThread()) //added this .subscribeOn(Schedulers.io()) //added this .flatMapIterable(a -> a) .doOnNext(a -> db.insert(a)) .doOnNext(a -> { w.airticleName = a.name; w.airticleUrl = a.url; }) .takeLast(1) .map(a -> w) ) .toList() .subscribe( modifiedWidgets -> saveWidgets(modifiedWidgets), throwable -> processWidgetError(throwable) ); ) apiService.getWidgets(token) .observeOn(AndroidSchedulers.mainThread()) //added this .subscribeOn(Schedulers.io()) //added this .flatMapIterable(v -> v) .flatMap(w -> apiService.getArticles(token, w.type) .observeOn(AndroidSchedulers.mainThread()) //added this .subscribeOn(Schedulers.io()) //added this .flatMapIterable(a -> a) .doOnNext(a -> db.insert(a)) .doOnNext(a -> { w.airticleName = a.name; w.airticleUrl = a.url; }) .takeLast(1) .map(a -> w) ) .toList() .subscribe( modifiedWidgets -> saveWidgets(modifiedWidgets), throwable -> processWidgetError(throwable) ); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.