Просмотр не обновляется с использованием LiveData, TimerTask и Retrofit - PullRequest
0 голосов
/ 23 апреля 2020

Я должен делать запрос GET каждую секунду, и я должен обновлять пользовательский интерфейс с входящими данными fre sh.

Мне удалось заставить работать повторяющийся сетевой запрос, используя Timer. Я вижу okhttp журналы, показывающие повторяющиеся ответы с данными fre sh каждую секунду.

Однако пользовательский интерфейс не обновляется с новыми данными. Он показывает только данные из первого запроса. Я попытался реализовать MVVM, вызывающий сеть и возвращающий LiveData, который будет наблюдаться во фрагменте.

Редактировать : я только что заметил, что новые данные добавляются в список как recyclerview теперь растет и растет каждую секунду с новыми предметами.

ViewModel

class RatesViewModel : ViewModel() {
    private val _rates = MutableLiveData<RatesResponse>()

    val rates : LiveData<RatesResponse>
        get() = _rates

    fun init(base: String) {
        timer("NetworkRequest",false, 0, 1000) {
            viewModelScope.launch {
                _rates.postValue(RatesRepository().getRates(base))

            }
        }
    }
}

Фрагмент

override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)

viewModel = ViewModelProvider(this).get(RatesViewModel::class.java)

viewModel.init("EUR")

    val ratesLiveData = viewModel.rates

    ratesLiveData.observe(viewLifecycleOwner, Observer { response ->
        addElements(response.rates)

        if (ratesAdapter == null) {
            setUpRecyclerView()
        } else {
            ratesAdapter!!.notifyDataSetChanged()

        }
    })

    setUpRecyclerView()
}

Добавить функцию элемента

private fun addElements(allRates: Rates) {
        ratesList.add(Currency(
            "EUR", "Euro", R.drawable.eur, 1.00))
        ratesList.add(Currency(
            "AUD", "Australian Dollar", R.drawable.aud, allRates.AUD))
        ratesList.add(Currency(
            "BGN", "Bulgarian Lev", R.drawable.bgn, allRates.BGN))
        ratesList.add(Currency(
            "BRL", "Brazilian Real", R.drawable.brl, allRates.BRL))
        ratesList.add(Currency(
            "CAD", "Canadian Dollar", R.drawable.cad, allRates.CAD))
        ratesList.add(Currency(
            "CHF", "Swiss franc", R.drawable.chf, allRates.CHF))
        ratesList.add(Currency(
            "CNY", "Chinese Yuan", R.drawable.cny, allRates.CNY))
        ratesList.add(Currency(
            "CZK", "Czech Koruna", R.drawable.czk, allRates.CZK))
        ratesList.add(Currency(
            "DKK", "Danish Krone", R.drawable.dkk, allRates.DKK))
        ratesList.add(Currency(
            "GBP", "British Pound", R.drawable.gbp, allRates.GBP))
        ratesList.add(Currency(
            "HKD", "Hong Kong Dollar", R.drawable.hkd, allRates.HKD))
        ratesList.add(Currency(
            "HRK", "Croatian Kuna", R.drawable.hrk, allRates.HRK))
        ratesList.add(Currency(
            "HUF", "Hungarian Forint", R.drawable.huf, allRates.HUF))
        ratesList.add(Currency(
            "IDR", "Indonesian Rupiah", R.drawable.idr, allRates.IDR))
        ratesList.add(Currency(
            "ILS", "Israeli Shekel", R.drawable.ils, allRates.ILS))
        ratesList.add(Currency(
            "INR", "Indian Rupee", R.drawable.eur, allRates.INR))
        ratesList.add(Currency(
            "ISK", "Icelandic Króna", R.drawable.isk, allRates.ISK))
        ratesList.add(Currency(
            "JPY", "Japanese Yen", R.drawable.jpy, allRates.JPY))
        ratesList.add(Currency(
            "KRW", "South Korean Won", R.drawable.krw, allRates.KRW))
        ratesList.add(Currency(
            "MXN", "Mexican Peso", R.drawable.mxn, allRates.MXN))
        ratesList.add(Currency(
            "MYR", "Malaysian Ringgit", R.drawable.myr, allRates.MYR))
        ratesList.add(Currency(
            "NOK", "Norwegian Krone", R.drawable.nok, allRates.NOK))
        ratesList.add(Currency(
            "NZD", "Bulgarian Lev", R.drawable.bgn, allRates.BGN))
        ratesList.add(Currency(
            "PHP", "Philippine Peso", R.drawable.php, allRates.PHP))
        ratesList.add(Currency(
            "PLN", "Polish Złoty", R.drawable.pln, allRates.PLN))
        ratesList.add(Currency(
            "RON", "Romanian Leu", R.drawable.ron, allRates.RON))
        ratesList.add(Currency(
            "RUB", "Russian Rouble", R.drawable.rub, allRates.RUB))
        ratesList.add(Currency(
            "SEK", "Swedish krona", R.drawable.sek, allRates.SEK))
        ratesList.add(Currency(
            "SGD", "Singapore Dollar", R.drawable.sgd, allRates.SGD))
        ratesList.add(Currency(
            "THB", "Thai Baht", R.drawable.thb, allRates.THB))
        ratesList.add(Currency(
            "USD", "United States Dollar", R.drawable.usd, allRates.USD))
        ratesList.add(Currency(
            "ZAR", "South African Rand", R.drawable.zar, allRates.ZAR))
    }

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Было ли какое-то форматирование для разделения различных частей логики c

VIEWMODEL

class RatesViewModel : ViewModel() {
    private val _rates = MutableLiveData<RatesResponse>()
    val rates : LiveData<RatesResponse>
        get() = _rates

    fun setupTimer(zone: String) = viewModelScope.launch { 
        timer("NetworkRequest",false, 0, 1000) { 
            val latestRates = getRates(zone)
            _rates.postValue(latestRates) 
            } 
        }

    suspend fun getRates(zone: String) = RatesRepository().getRates(zone)
}

FRAGMENT

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    viewModel = ViewModelProvider(this).get(RatesViewModel::class.java)

    viewModel.setupTimer("EUR")
    val ratesLiveData = viewModel.rates

    ratesLiveData.observe(viewLifecycleOwner, Observer { response ->
        addElements(response.rates)
    })

    /**
    * Your recyclerView should not get setup again and again anytime a new value is posted in the livedata.
    */

    if (ratesAdapter == null) setUpRecyclerView()
    else ratesAdapter!!.notifyDataSetChanged()
}

Вы упомянули, что новые данные добавляются в конце списка, т.е. allRates, в этом случае вместо ADD используйте UPDATE, поскольку ADD не удалит старые элементы .

0 голосов
/ 23 апреля 2020

Я исправил это, вызвав метод clear() в списке при запуске функции addElemenet().

Хотя я не думаю, что это правильно.

...