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
J'ai besoin de montrer tous les articles avec leurs images. Ce sont mes appels d'API à l'aide de modernes p> 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
}
4 Réponses :
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);
Vous ne vous abonnez pas à l'intérieur de la carte. Essayez ceci:
Si vous souhaitez vraiment retourner un quelque chose comme ça: P> Observable
réduire code>?
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())
}
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>>
J'ai toujours un problème avec le type de retour, qui est mon type de retour est maintenant célibataire
Vous pouvez utiliser mappe {arraylist (it)} code> pour aller de
Liste code> à
ArrayList code>
Que voulez-vous revenir de
getItemsData code>?
itemData code> ou
itemDétails code>?
Observable <> code> ou
unique> code>?
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.