Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 未使用LiveData、TimerTask和改装更新视图_Android_Android Livedata - Fatal编程技术网

Android 未使用LiveData、TimerTask和改装更新视图

Android 未使用LiveData、TimerTask和改装更新视图,android,android-livedata,Android,Android Livedata,我必须每秒发出一个GET请求,并且必须用传入的新数据更新UI 我设法使用计时器使重复的网络请求工作。我可以看到okhttp日志,显示每秒使用新数据的重复响应 但是,UI没有使用新数据进行更新。它只显示来自第一个请求的数据。我尝试实现MVVM调用网络并返回一个LiveData,以便在片段中观察 编辑:我刚刚注意到新数据被添加到列表中,因为回收视图现在随着新项目的增加而不断增加 视图模型 class RatesViewModel : ViewModel() { private val _ra

我必须每秒发出一个GET请求,并且必须用传入的新数据更新UI

我设法使用
计时器使重复的网络请求工作。我可以看到
okhttp
日志,显示每秒使用新数据的重复响应

但是,UI没有使用新数据进行更新。它只显示来自第一个请求的数据。我尝试实现MVVM调用网络并返回一个
LiveData
,以便在片段中观察

编辑:我刚刚注意到新数据被添加到列表中,因为
回收视图
现在随着新项目的增加而不断增加

视图模型

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))

            }
        }
    }
}
添加元素功能

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))
    }

做了一些格式化来分隔逻辑的不同部分

视图模型
您提到,新数据将附加在列表的末尾,即allRates,在这种情况下,使用
,而不是
,因为ADD不会删除旧元素。

我通过调用
clear()
函数开头列表中的方法


不过,我认为这不是正确的做法。

加法器()在做什么?请将其附加到repo.viewModelScope.launch{timer(“NetworkRequest”,false,0,1000{{u rates.postValue(RatesRepository().getRates(base))}}@karandhillon谢谢!我编辑了这个问题,我注意到有新的事情正在发生。我已经在上面解释过了。@saurabh1489我已经尝试过了,但是我得到了一个复杂的错误:暂停函数只能在coroutine Body内调用谢谢你的回答。但是,当提取“if(ratesdapter==null)”时,它不起作用setUpRecyclerView()其他ratesAdapter!!.notifyDataSetChanged()在观察者之外。你知道为什么吗?你想要的是你的数据集,它被提取到recyclerView的适配器来观察LiveData。如果你想对LiveData做一些修改,那么就对它进行转换。你现在做的是获取LiveData,在你的addElements()中修改它方法。改为在ViewModel中进行修改。您的活动应仅用作容器。观看此视频,您会理解的,谢谢!这肯定有很大帮助。但是,我看不到将具有多个浮动字段的对象转换为列表的方法,其中每个元素都是对象中的一个浮动字段。我有看到了将一个列表转换为另一个列表的方法,但没有看到将一个对象转换为列表的方法。您知道这是否可行吗?
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))
    }
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)
}
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()
}