Rx Java toList () не вызывает метод подписки () (с комнатой) - PullRequest
3 голосов
/ 27 февраля 2020

У меня есть запрос на получение championList из базы данных комнат. Я просто хочу сделать еще один запрос, используя championId для каждого предмета. Поэтому я использовал Observable.fromIterable (). У меня есть два запроса в общей сложности, и оба они возвращаются наблюдаемые. Я объясню свой код ниже:

private fun getData() {
        appDatabase.tierListDao().getChampionOfTier()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .concatMap {
                Observable.fromIterable(it)
            }
            .doOnNext {
                tierListMap[it.championTable!!.id!!] = TierChampionAndCounterPicks().apply {
                    tierAndChampion = it
                }
            }
            .flatMap { tierAndChampion ->
                appDatabase.counterPicksDao()
                    .getCounterPicksWithChampionId(tierAndChampion.championTable!!.id!!)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
            }
            .map {
                tierListMap[it.first().counterPicksTable?.low_level_champion_id]?.apply {
                    counterPicksTableList = it
                }?.let { tier ->
                    tierList.add(tier)
                }
                tierList
            }
            .toList()
            .subscribe({
                tierListAdapter = TierListAdapter(context!!, tierList)
                tierListRv.adapter = tierListAdapter
            }, {
                it.printStackTrace()
            })
    }

Я сохраняю свой первый результат на карту с помощью doOnNext. С flatMap я делаю второй запрос, используя championId. Я также сохраняю свой второй результат на карту с помощью метода map (). После этого я хочу активировать метод подписки только один раз. Но без метода toList () подписка вызывается длиной моего списка. При использовании метода toList () подписка никогда не запускается. Как я могу это исправить?

1 Ответ

0 голосов
/ 27 февраля 2020

Попробуйте использовать take (1) вместо toList (), но вы должны стараться не сохранять свои результаты из потока и делать это внутри.

РЕДАКТИРОВАТЬ это решение должно работать так, как вы хотите:

private fun getData() {
    appDatabase.tierListDao().getChampionOfTier()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .switchMap{ champions ->
            val tierChamps = champions.map { 
                TierChampionAndCounterPicks().apply {
                    tierAndChampion = it
                }
            }

            Observable.fromIterable(tierChamps).switchMap { tierChamp ->
                appDatabase.counterPicksDao()
                    .getCounterPicksWithChampionId(tierChamp.championTable!!.id!!)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .map { counterPicksTableList ->
                        tierChamp.apply {
                            counterPicks = counterPicksTableList
                        }
                    }
            }
        }
        .toList()
        .subscribe({ tierList ->
            tierListAdapter = TierListAdapter(context!!, tierList)
            tierListRv.adapter = tierListAdapter
        }, {
            it.printStackTrace()
        })
}
...