Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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 如何在我的viewmodel中重试请求_Android_Kotlin_Mvvm_Android Livedata_Android Viewmodel - Fatal编程技术网

Android 如何在我的viewmodel中重试请求

Android 如何在我的viewmodel中重试请求,android,kotlin,mvvm,android-livedata,android-viewmodel,Android,Kotlin,Mvvm,Android Livedata,Android Viewmodel,我正在尝试重试从Firebase获取数据的逻辑,我的应用程序的作用如下 如果没有internet连接,它将触发故障资源并显示重试按钮,但当我单击此按钮时,viewmodel似乎不会再次请求数据,而只是显示在我的进度中,而不会再次向我的repo请求数据 用户界面 我在这里看到的是我的资源。按mybtn\u retry后再次请求数据失败,但它只显示我的进度条,什么也没有发生 视图模型 在我的资源中再次调用viewModel.get奖品后,为什么不重新获取我的值。失败?第二次调用viewModel.g

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

如果没有internet连接,它将触发故障资源并显示重试按钮,但当我单击此按钮时,viewmodel似乎不会再次请求数据,而只是显示在我的进度中,而不会再次向我的repo请求数据

用户界面 我在这里看到的是我的资源。按my
btn\u retry
后再次请求数据失败,但它只显示我的进度条,什么也没有发生

视图模型
在我的
资源中再次调用
viewModel.get奖品
后,为什么不重新获取我的值。失败

第二次调用
viewModel.get奖品
没有附加的
观察者,因此在有观察者之前它不会获得值

您必须在当前的
观察者中再次调用
viewModel.get奖品.observe(…)
,这不是最佳的


您必须重新考虑一下您的设计,这样您就可以触发对
useCase.fetch奖品()
的新调用,并且仍然可以通过观察原始
LiveData

从第二次调用
viewModel的
LiveData
来获取新值。get奖品
没有附加任何
observators
,因此,在有一个值之前,它不会得到一个值

您必须在当前的
观察者中再次调用
viewModel.get奖品.observe(…)
,这不是最佳的


您必须重新考虑一下您的设计,这样您就可以触发对
useCase.fetch奖品()
的新调用,并且仍然可以通过观察原始
LiveData

来获取新值。我最后做的是一个转换,因为只要可变值发生变化,就可以触发转换,我可以这样重试整个协同程序

 private val shouldRetry = MutableLiveData<Boolean>()
    val fetchPrizes: LiveData<Resource<Prizes>> = Transformations.switchMap(shouldRetry) {
        liveData(context = viewModelScope.coroutineContext + Dispatchers.IO) {
          emit(Resource.Loading())
        try{
            val prizes = useCase.fetchPrizes()
            emit(prizes)
        }catch (e:Exception){
            Crashlytics.logException(e.cause)
            emit(Resource.Failure(e.cause!!))
        }
        }
    }

    fun retryData(retry: Boolean) {
        shouldRetry.value = retry
    }
private val shouldRetry=MutableLiveData()
val:LiveData=Transformations.switchMap(shouldRetry){
liveData(context=viewModelScope.coroutineContext+Dispatchers.IO){
发出(Resource.Loading())
试一试{
val vales=useCase.fetch奖品()
发放(奖品)
}捕获(e:例外){
Crashlytics.logException(即原因)
发出(资源失败(例如原因!!)
}
}
}
fun retryData(重试:布尔值){
shouldRetry.value=重试
}

然后在我的UI中,只要我想调用
viewModel.retryData(true)
,我最后做的就是转换,因为只要可变值发生变化,转换就会被触发,所以我可以重试整个协程

 private val shouldRetry = MutableLiveData<Boolean>()
    val fetchPrizes: LiveData<Resource<Prizes>> = Transformations.switchMap(shouldRetry) {
        liveData(context = viewModelScope.coroutineContext + Dispatchers.IO) {
          emit(Resource.Loading())
        try{
            val prizes = useCase.fetchPrizes()
            emit(prizes)
        }catch (e:Exception){
            Crashlytics.logException(e.cause)
            emit(Resource.Failure(e.cause!!))
        }
        }
    }

    fun retryData(retry: Boolean) {
        shouldRetry.value = retry
    }
private val shouldRetry=MutableLiveData()
val:LiveData=Transformations.switchMap(shouldRetry){
liveData(context=viewModelScope.coroutineContext+Dispatchers.IO){
发出(Resource.Loading())
试一试{
val vales=useCase.fetch奖品()
发放(奖品)
}捕获(e:例外){
Crashlytics.logException(即原因)
发出(资源失败(例如原因!!)
}
}
}
fun retryData(重试:布尔值){
shouldRetry.value=重试
}

然后从我的UI中,我只要调用
viewModel.retryData(true)
就可以了

我正在删除Firebase标签,因为这里的问题和相关代码似乎与它没有直接关系。我正在删除Firebase标签,因为这里的问题和相关代码似乎与此没有直接关系。有没有办法在这个协同程序范围内调用此函数?因为我使用的是suspend函数,所以我需要移动我的整个代码。有没有办法在这个协程范围内调用这个函数?因为我使用的是suspend函数,所以我需要移动整个代码
 private val shouldRetry = MutableLiveData<Boolean>()
    val fetchPrizes: LiveData<Resource<Prizes>> = Transformations.switchMap(shouldRetry) {
        liveData(context = viewModelScope.coroutineContext + Dispatchers.IO) {
          emit(Resource.Loading())
        try{
            val prizes = useCase.fetchPrizes()
            emit(prizes)
        }catch (e:Exception){
            Crashlytics.logException(e.cause)
            emit(Resource.Failure(e.cause!!))
        }
        }
    }

    fun retryData(retry: Boolean) {
        shouldRetry.value = retry
    }