Дублирование ответов от 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)
}