0
votes

Comment combiner plusieurs appels d'API pour créer un objet de réponse unique en utilisant rxjava

Je construis une application composée de deux appels d'API. J'apprends toujours Rxjava et je ne sais pas comment combiner correctement les deux appels d'API

  1. Le premier appel de l'API est utilisé pour récupérer des éléments sous forme de liste li>
  2. Le deuxième appel de l'API est utilisé pour récupérer l'image de l'élément à l'aide du nom de l'article que j'ai reçu depuis le premier appel. LI> OL>

    J'ai besoin de montrer tous les articles avec leurs images. Ce sont mes appels d'API à l'aide de modernes p> xxx pré>

    Ceci est le code qui a écrit avec RXJAVA: P>

        fun getItemsData(): Observable<ArrayList<ItemDetails>> {
    
        val data = ArrayList<ItemDetails>()
    getItems().flatMap { itemResponse -> Observable.just(itemResponse.message) } //this will give me a list with item names
            .flatMapIterable { data -> data }//iterating over the list and for every item...
            .map { itemName ->//calling to get the item image
                getItemDetails(itemName).map { imageData ->
                    val itemImage = imageData.message
                    data.add(ItemData(itemName, itemImage))//from this point on I'm lost, I'm not sure if it's the right thing to add here the data
                }.subscribeOn(Schedulers.io())
            }.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
    
        return Observable.create(data)// not sure how to create an Observable from the data
    }   
    


3 commentaires

Que voulez-vous revenir de getItemsData ? itemData ou itemDétails ? Observable <> ou unique > ?


Le courant intérieur de la carte extérieure ne se fait même pas souscrit. Cela ne fonctionnera pas.


@Andreitanana, idéalement, je veux retourner Observable >. Je pourrais l'observer plus tard dans mon viewModel et mettre à jour l'interface utilisateur en conséquence.


4 Réponses :


0
votes

Vous devez cartographier le flux de mappage plat pour renvoyer le type souhaité -

getItems()
.flatMap(item -> getItemDetails(item)
                 .map(itemDetail -> ItemData(item, itemDetail.image))
.subscribe(itemData -> // your desired type containing the original item and image);


0 commentaires

0
votes

Vous ne vous abonnez pas à l'intérieur de la carte. Essayez ceci: xxx


0 commentaires

0
votes

Si vous souhaitez vraiment retourner un Observable > code>, vous pouvez utiliser réduire code>?

quelque chose comme ça: P>

fun getItemsData(): Observable<ArrayList<ItemDetails>> {
   return
     getItems().flatMap { itemResponse -> Observable.just(itemResponse.message) }
               .flatMapIterable { data -> data }
               .flatMap { itemName -> getItemDetails(itemName)  }.subscribeOn(Schedulers.io())
               .map { imageData -> ItemData(itemName, imageData.message) } }
               .reduce(ArrayList<ItemDetails>(), (list, item) -> list.add(item))
               .toObservable()   
               .subscribeOn(Schedulers.io())
               .observeOn(AndroidSchedulers.mainThread())
}


0 commentaires

0
votes

Vous n'avez pas vraiment besoin de cela ...

.flatMapIterable { data -> data } // here we have Observable<Message>
.flatMap { itemName ->
     getItemDetails(itemName).map { imageData ->
        ItemData(itemName, imageData)
     }
 } // Observable<ItemData>
.toList() // Single<List<ItemData>> -> you can use toObservable to get an Observable<List<ItemData>>


2 commentaires

J'ai toujours un problème avec le type de retour, qui est mon type de retour est maintenant célibataire > et ce que le compilateur trouvé est une liste unique <(mutable) !>!>!


Vous pouvez utiliser mappe {arraylist (it)} pour aller de Liste à ArrayList