Как синхронизировать два асинхронных потока в rxJava2
Учусь работать в AndroidStudio, только начал изучать RxJava2. Сейчас пытаюсь сделать маленькое приложение с PokeAPI. Проблема следующая, получаю количество покемонов и их имя с API в одном потоке, а дальше по их имении делаю запрос к API, что бы получить их изображение, сейчас они работают асинхронно и так все выводится, но хочу понять, можно ли как то сделать это синхронно, чтоб приложение получило имя, а потом сразу для него получило картинку.
Код этих методов, которых хочу синхронизировать представлен ниже, за любой совет буду крайне признателен
private fun responseListPokemonAPI(limit: Int, offset: Int) {
retrofit.getPokemonList(limit, offset)
.subscribeOn(Schedulers.single())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : SingleObserver<ListPokemonsAPI> {
override fun onSubscribe(d: Disposable) {}
override fun onSuccess(t: ListPokemonsAPI) {
val count = t.count
for (i in 0 until count) {
val name = t.results.get(i).name
responseIconPokemonAPI(name)
}
}
override fun onError(e: Throwable) {}
})
}
private fun responseIconPokemonAPI(name: String){
retrofit.getPokemon(name)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<PokemonInfoAPI> {
override fun onSubscribe(d: Disposable) {
}
override fun onNext(t: PokemonInfoAPI) {
var icon = t.sprites.front_default
val number = t.id
if (icon == null) {
icon = t.sprites.other.official_artwork.front_default
if (icon == null) {
icon = t.sprites.versions.generation.icons.front_default
}
}
val pokemon = Pokemon(name, icon, number)
listPokemon.add(pokemon)
listPokemon.sortBy {
it.number
}
adapter.notifyDataSetChanged()
}
override fun onError(e: Throwable) {
}
override fun onComplete() {
}
})
}
Ответы (1 шт):
Автор решения: ЮрийСПб
→ Ссылка
Да, вы можете сделать следующее:
- Преобразовать источник данных списка чего-то в источник данных каждого элемента списка.
- Для каждого эмита в источнике данных что-то выполнить, например запустить другой источник данных на основе данных из источника из п1
- Обратно собрать все данные из п2 в источник списка данных, полученных в п2.
Примерный код может так выглядеть:
Single.fromCallable { listOf<String>() } //Single<List<String>>
.flatMapObservable { Observable.fromIterable(it) } //Observable<String>
.flatMapSingle { Single.fromCallable { it.toInt() } } //Observable<Int>
.toList() //Single<List<Int>>