Работает ли блок кода LiveDataScope только один раз после emit ()? - PullRequest
1 голос
/ 02 марта 2020

Как сказано в заголовке, блок кода LiveDataScope запускается только один раз после emit ()? Можно ли сделать так, чтобы мой блок кода LiveDataScope выполнялся более одного раза, потому что мне нужно отправить запрос на сервер, и в случае сбоя я хотел бы вызвать тот же код, чтобы повторить попытку.

Пример кода:

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

когда я вызываю эту функцию, после emit (), если я снова вызываю функцию, никогда не попадет внутрь.

1 Ответ

0 голосов
/ 03 марта 2020

Вы должны создать 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. Убедитесь, что Flow работает на Dispatchers.IO.
  3. Наблюдайте myLiveData из вашего интерфейса.
...