Дублирование ответов от Retrofit 2

я столкнулся с такой проблемой. Я делаю 2 запроса к внешнему API через Retrofit 2 + RxJava 3, но вместо одной строчки ответа они выводят по две. (Если сделать 3 запроса то каждый из них выведет по три строчки и т.д.). Вот как я вызываю получение данных из MainActivity:

getRealTimePrice("AAPL")
getRealTimePrice("YNDX")

Вот код самого метода:

fun getRealTimePrice(input: String) {
        val viewModel = ViewModelProvider(this).get(PriceViewModel::class.java)
        viewModel.getPriceObserver().observe(this, Observer<RealTimePriceModel> { it ->
            if(it != null) {
                Log.d(TAG, it.toString())
            }
            else {
                Log.e(TAG, "Error in fetching data")
            }
        })
        viewModel.makeApiCall(input)
    }

А это ViewModel

class PriceViewModel: ViewModel() {
    var price: MutableLiveData<RealTimePriceModel> = MutableLiveData()

    fun getPriceObserver(): MutableLiveData<RealTimePriceModel> {
        return price
    }

    fun makeApiCall(ticker: String) {
        val retrofitInstance = RetrofitYahooFinanceInstance.getRetrofitInstance().create(RetrofitService::class.java)
        retrofitInstance.getRealTimePrice(ticker)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(getPriceObserverRx())
    }

    private fun getPriceObserverRx(): Observer<RealTimePriceModel> {
        return object : Observer<RealTimePriceModel> {
            override fun onComplete() {
                // Hide progress bar
            }

            override fun onError(e: Throwable?) {
                price.postValue(null)
            }

            override fun onNext(t: RealTimePriceModel?) {
                price.postValue(t)
            }

            override fun onSubscribe(d: Disposable?) {
                // Show progress bar
            }
        }
    }

}

И вот что выводится в консоль:

D/MainActivity: RealTimePriceModel(quoteSummary=QuoteSummary(result=[PriceResult(price=PriceInfo(regularMarketChangePercent=RegularMarketChangePercent(fmt=1.24%), regularMarketPrice=RegularMarketPrice(fmt=66.04), regularMarketChange=RegularMarketChange(fmt=0.81), currency=USD))]))
    RealTimePriceModel(quoteSummary=QuoteSummary(result=[PriceResult(price=PriceInfo(regularMarketChangePercent=RegularMarketChangePercent(fmt=1.24%), regularMarketPrice=RegularMarketPrice(fmt=66.04), regularMarketChange=RegularMarketChange(fmt=0.81), currency=USD))]))
D/MainActivity: RealTimePriceModel(quoteSummary=QuoteSummary(result=[PriceResult(price=PriceInfo(regularMarketChangePercent=RegularMarketChangePercent(fmt=-0.50%), regularMarketPrice=RegularMarketPrice(fmt=119.93), regularMarketChange=RegularMarketChange(fmt=-0.6), currency=USD))]))
    RealTimePriceModel(quoteSummary=QuoteSummary(result=[PriceResult(price=PriceInfo(regularMarketChangePercent=RegularMarketChangePercent(fmt=-0.50%), regularMarketPrice=RegularMarketPrice(fmt=119.93), regularMarketChange=RegularMarketChange(fmt=-0.6), currency=USD))]))

В чем может быть проблема?


Ответы (1 шт):

Автор решения: tosh17

Создавайте viewmodel и подписку на livedata в методе который запускается один раз Например если вы это запускаете во фрагменте, то самое хорошее место для этого onViewCreated

 lateinit var viewModel : PriceViewModel
 override fun onViewCreated(view: View, savedInstanceState: Bundle?){
 viewModel = ViewModelProvider(this).get(PriceViewModel::class.java)
    viewModel.getPriceObserver().observe(this, Observer<RealTimePriceModel> { it ->
        if(it != null) {
            Log.d(TAG, it.toString())
        }
        else {
            Log.e(TAG, "Error in fetching data")
        }
    })
 }
  fun getRealTimePrice(input: String) {
      viewModel.makeApiCall(input)
}
→ Ссылка