android - 如何在我的视图模型中重试请求
问题描述
我正在尝试重试从 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
?
解决方案
从LiveData
第二次调用 toviewModel.getPrizes
没有Observers
附加到它,因此它不会得到一个值,直到有一个。
您将不得不在不是最佳viewModel.getPrizes.observe(...)
的电流内再次调用。Observer
您将不得不重新考虑您的设计,以便您可以触发新的调用useCase.fetchPrizes()
并仍然通过观察原始LiveData
.
推荐阅读
- r - 使用数据表左连接
- javascript - 为什么在 JavaScript 的 IF 语句中允许重新声明变量
- javascript - 获取点击图片
- python-3.x - 如何使用python和selenium检查网页(不是源代码)上是否存在文本?
- python - 合并具有相同列名和不同行大小的 DF,在重复行处填充 NAN
- jquery - Jquery附加跨度
- php - Ajax 调用输出 div
- google-chrome - chrome 控制台中的扩展对象键现在未排序
- scala - 在 Spark 数据框中运行 UDF 时,不支持获取 org.apache.spark.sql.Column 类型的架构
- command-line - 我需要在一行中获取文件夹列表