Как синхронизировать два асинхронных потока в 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. Для каждого эмита в источнике данных что-то выполнить, например запустить другой источник данных на основе данных из источника из п1
  3. Обратно собрать все данные из п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>>
→ Ссылка