问题描述
我正在尝试学习使用Rxjava进行翻新的Api调用。我必须在循环中进行多个api调用。我正在努力争取订户的价值。
@GET("pokemon" + "/{id}")
fun getPokemonData(@Path("id") id: Int):
Observable<Pokemon>
我期望在我的订户中获得一个Pokemon对象,但我却获得了一个Observable对象。如何将其转换为Pokemon对象?
Observable.fromIterable(list)
.flatMap { it ->
Observable
.just(it.url)
.map { PokeApi.retrofitService.getPokemonData(getPokemonIdFromUrl(it))
}
}
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
//onNext --I'm expecting to get a Pokemon Object here,instead I get a Observable<Pokemon>
},{//onError},{// do something when all api calls are done?})
我的目标是使用“列表”中的ID进行api调用,并在所有api调用完成后得到“通知”。这是解决此问题的正确方法吗?
解决方法
问题出在这里:
Observable
.just(it.url)
.map { PokeApi.retrofitService.getPokemonData(getPokemonIdFromUrl(it)) }
使用map
时,它映射到getPokemonData
的返回对象。您可能想flatMap
:
Observable
.just(it.url)
.flatMap { PokeApi.retrofitService.getPokemonData(getPokemonIdFromUrl(it)) }
这不仅会映射结果,而且还会将结果展平,这样您就不会得到可观察到的结果,而是该可观察到的结果。