LiveDataScope代码块仅在emit()之后只运行一次吗?

问题描述 投票:1回答:1

如标题中所述,LiveDataScope代码块在emit()之后仅运行一次吗?是否可以使我的LiveDataScope代码块运行多次,因为我需要向服务器发出请求,如果失败,我想调用相同的代码再试一次。

代码示例:

    fun refreshLiveDataResource() = liveData(Dispatchers.Main){
        val retriveRoutes = remoteDataSourceKt.getRoutes()
        if(retriveRoutes.data != null){
            routeList = retriveRoutes.data
        }
        emit(retriveRoutes)
      }

[当我调用此函数时,如果再次调用该函数,在emit()之后,永远都不会进入内部。

android kotlin androidx android-livedata kotlin-coroutines
1个回答
0
投票

您应该创建一次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()

您必须:

  1. 使getRoutes()方法返回一个Flow
  2. 确保FlowDispatchers.IO上可用。
  3. 从用户界面中观察myLiveData
© www.soinside.com 2019 - 2024. All rights reserved.