Android 如何在我的viewmodel中重试请求
我正在尝试重试从Firebase获取数据的逻辑,我的应用程序的作用如下 如果没有internet连接,它将触发故障资源并显示重试按钮,但当我单击此按钮时,viewmodel似乎不会再次请求数据,而只是显示在我的进度中,而不会再次向我的repo请求数据 用户界面 我在这里看到的是我的资源。按myAndroid 如何在我的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
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
}