如标题中所述,LiveDataScope代码块在emit()之后仅运行一次吗?是否可以使我的LiveDataScope代码块运行多次,因为我需要向服务器发出请求,如果失败,我想调用相同的代码再试一次。
代码示例:
fun refreshLiveDataResource() = liveData(Dispatchers.Main){
val retriveRoutes = remoteDataSourceKt.getRoutes()
if(retriveRoutes.data != null){
routeList = retriveRoutes.data
}
emit(retriveRoutes)
}
[当我调用此函数时,如果再次调用该函数,在emit()之后,永远都不会进入内部。
您应该创建一次LiveData
,并在需要时更新其值,而不是在每次重试时都创建一个新的。我会用Flow
代替,用LiveData
运算符更新retry
,以防出现某些错误,例如:
val routesLiveData =
remoteDataSourceKt.getRoutes()
.onEach { retriveRoutes ->
if(retriveRoutes.data != null){
routeList = retriveRoutes.data
}
}
.retry(3) { e -> // retries up to 3 times; no argument means retrying forever
(e is IOException) // retry on any IOException but also introduce delay if retrying
.also {
if (it)
delay(1000)
}
}
.asLiveData()
您必须:
getRoutes()
方法返回一个Flow
。 Flow
在Dispatchers.IO
上可用。myLiveData
。