Je suis bloqué sur une tâche simple et je suis presque sûr que je me dirige dans la mauvaise direction. J'ai juste besoin d'aller chercher une liste d'articles. Je ne peux obtenir des articles que par 50 et je ne connais pas le nombre exact de page.

Donc, ce que je dois faire, c'est passer l'appel et le répéter jusqu'à ce que j'obtienne moins de 50 éléments (ce qui signifie que c'est la dernière page), puis renvoyer la liste complète avec un insert dans une base de données

L'appel api est un single, et je dois en renvoyer un. Appel API :

@GET("posts")
    fun getItems(@Query("page") page: Int, @Query("per_page") perPage: Int): Single<List<Item>>

Voici ce que j'ai obtenu jusqu'à présent:

fun getItems(): Single<List<Item>> {
    var result = listOf<Item>()
    return Observable.range(1, Integer.MAX_VALUE).concatMapSingle { page ->
            remoteDataSource.getItems(page, 50).map {
                result = it
                it
            }
        }.repeatUntil {
            result.size != 50
        }.single(emptyList()).map {
            localDataSource.insertItems(it)
            it
        }
}

Le problème est que j'ai une erreur lorsque la deuxième page est récupérée : java.lang.IllegalArgumentException : la séquence contient plus d'un élément !

Comment puis-je faire pour ajouter chaque appel à une liste et émettre cette liste lorsque j'ai atteint la dernière page ? Dois-je changer simple en fluide par exemple ?

0
Guigui 18 févr. 2020 à 16:01

1 réponse

Meilleure réponse

Vous avez besoin de takeUntil pour couper la pagination et ré-accumuler toutes les pages individuelles :

Observable.range(1, Integer.MAX_VALUE)
.concatMapSingle { page ->
        remoteDataSource.getItems(page, 50)
}
.takeUntil {
        it.size != 50
}
.flatMapIterable { it }
.toList()
1
akarnokd 18 févr. 2020 à 15:03