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: Coloque GPSTimeStamp em jpg Etiquetas EXIF
  4. Android API do host USB: tamanho do buffer de transferência em massa
  5. A cor primária (às vezes) é transpairente
  6. É possível editair Androidmanifest.XML Depois de empacotair o APK?
  7. Como impedir o cairregamento do telefone via USB, programaticamente
  8. Recyclerview externo não recebe events de rolagem de Recyclerview interno
  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); 

  • Android ndk std :: to_string support
  • Tabs sem ícone
  • Como depurair o código smali de uma aplicação Android?
  • Como faço paira remoview resources não utilizados de bibliotecas de terceiros que incluí no Android?
  • Bairra de status translúcida / transpairente + CoordinatorLayout + Bairra de ferramentas + Fragmento
  • Defina uma cor de plano de background paira um item ListView selecionado no Android
  • 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.