首页 > 解决方案 > 如何在我的视图模型中重试请求

问题描述

我正在尝试重试从 Firebase 获取数据的逻辑,我的应用程序的功能如下。

如果没有互联网连接,它将触发失败资源并显示重试按钮,但是当我单击此按钮时,视图模型似乎没有再次请求数据,而是只是显示我的进度而不再次请求数据我的回购

用户界面

 viewModel.getPrizes.observe(viewLifecycleOwner, Observer { it ->
            when(it){
                is Resource.Loading -> {
                  // Loading...
                }
                is Resource.Success -> {
                    hideProgress()
                    setArrayData(it.data)
                }
                is Resource.Failure -> {
                    hideProgress()
                    hidePrizes()
                    retry_constrain.visibility = View.VISIBLE
                    btn_retry.setOnClickListener{
                        viewModel.getPrizes
                        showProgress()
                        retry_constrain.visibility = View.GONE
                    }
                    Toast.makeText(
                        requireContext(),
                        "An error has ocourred:${it.throwable.message}",
                        Toast.LENGTH_SHORT
                    ).show()
                }
            }
        })

我在这里看到的是我的 Resource.Failure 在按下我之后再次请求数据btn_retry但是它只显示我的进度条并且没有任何反应

视图模型

class PrizesViewModel(private val useCase:IPrizes): ViewModel() {

    val getPrizes = liveData(Dispatchers.IO) {
        emit(Resource.Loading())
        try{
            val prizes = useCase.fetchPrizes()
            emit(prizes)
        }catch (e:Exception){
            Crashlytics.logException(e.cause)
            emit(Resource.Failure(e.cause!!))
        }
    }
}

viewModel.getPrizes为什么在我再次调用后不重新获取我的值Resource.Failure

标签: androidkotlinmvvmandroid-livedataandroid-viewmodel

解决方案


LiveData第二次调用 toviewModel.getPrizes没有Observers附加到它,因此它不会得到一个值,直到有一个。

您将不得不在不是最佳viewModel.getPrizes.observe(...)的电流内再次调用。Observer

您将不得不重新考虑您的设计,以便您可以触发新的调用useCase.fetchPrizes()并仍然通过观察原始LiveData.


推荐阅读