Administrando el estado de la red usando RxJava

A menudo usamos RxJava para obtener el resultado de la red, pero normalmente tenemos que indicarnos si es √Čxito o Error. Qu√© bueno si tambi√©n pudiera decirnos el estado de carga y quiz√°s tambi√©n el estado de vac√≠o (nada cargado), as√≠ que no necesitamos manejar esa l√≥gica por separado, y hacer que se comunique con el resultado de ver el estado.

Comenzar

Creo que el c√≥digo RxJava de abajo ya no es extra√Īo para cualquiera que haya codificado una llamada de red.

service.fetchResult()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
datos -> procesar(datos) },
error -> report_error(error) }
)

Es supercool, ya que ayuda a poner la petición de red en segundo plano fácilmente, y a manejar el resultado o el resultado fácilmente.

Ser m√°s codicioso

Muchas veces, queremos algo más que sólo Datos o Error. Mientras esperamos a que se obtenga, queremos mostrar el estado de carga en la interfaz de usuario. Si el resultado vuelve como resultado vacío, queremos mostrar Estado vacío.

Para conseguirlo, escribimos m√°s c√≥digo alrededor del c√≥digo de b√ļsqueda de Rx de arriba (quiz√°s dentro de nuestro presentador) para manejar y actualizar la interfaz de usuario en consecuencia.

Que bueno si pudiéramos hacer todo eso en RxJava, como se ilustra en el diagrama de abajo.

Sea m√°s inteligente

Pensando en ello, podríamos hacerlo. En lugar de manejar toda la lógica de nuestro presentador, hemos utilizado un modelo que representa a todo el estado.

Aquí lo definí como sigue

clase de datos UiStateModel (
privado val en progreso: Booleano = falso,
private val errorMessage: Cadena? = nulo,
privado val dataModel: DataModel? = nulo
) {

fun isLoading() = en progreso fun isError() = errorMessage != null diversión isSuccess() = dataModel?.dataString?.isNotEmpty() ?: false&&&!isError() fun isEmpty() = !inProgress &&& errorMessage == null&& !isSuccess() }

>

Podríamos configurar el modelo que almacena el indicador en progreso, errorMessage y datos. Basado en esta información, el modelo puede ser utilizado para comprobar si está en estado de carga, error, éxito o vacío.

Para hacer esto mejor, podríamos hacer que el tener alguna clase estática que instancie UiStateModel por el estado.

objeto acompa√Īante {
    fun loading() = UiStateModel(inProgress = true)
    éxito divertido (dataModel: DataModel)
        = UiStateModel(dataModel = dataModel)
    fun error(error: Lanzable)
        = UiStateModel(errorMessage = error.message)
}

>

Enlazar

As√≠ que con este modelo ahora podr√≠amos representar al Estado, ¬Ņc√≥mo podr√≠amos combinarnos para hacer uso de √©l? Compruebe el c√≥digo de abajo que se utiliza en el presentador.

service.fetchResult()
.map { datos -> UiStateModel.success(datos) }
.onErrorReturn
excepción -> UiStateModel.error(excepción) }
.startWith(UiStateModel.loading())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
uiState -> -> el estado del arte
cuando {
uiState.isLoading() -> view.isLoading()
uiState.isError() -> -> uiState.isError()
view.isError(uiState.getErrorMessage())
uiState.isSuccess () -> -> El éxito
view.isSuccess(uiState.getData())
uiState.isEmpty() -> view.isEmpty()
else -> IllegalArgumentException(“Respuesta no v√°lida”)
}
})

Después de obtener el resultado del servidor, si tiene éxito, lo convertimos en un UiStateModel de éxito. Si es un error, usamos onErrorReturn para convertirlo en un error UiStateModel.

Lo bueno aquí es que, al principio, podríamos usar startWith para convertirlo a UiStateModel.

Ahora tenemos todos los estados especificados, incluyendo el Estado vacío, que se maneja internamente dentro del Modelo UiState para definir su estado.

Obtener código

He hecho un ejemplo de código que muestra el flujo en https://github.com/elye/demo_rxjava_manage_state

Muestra todos los escenarios de los estados como se muestra a continuación. Diviértete!

El ejemplo aqu√≠ es un ejemplo muy simplificado seg√ļn lo compartido por Jake Wharton. Compru√©belo m√°s a fondo para obtener m√°s informaci√≥n.

Presentación: El estado del estado gestor con RxJava

Haga clic en “‚̧” a continuaci√≥n para compartir. Gracias! ~ Twitter:elye ; Facebook:elye

Desarrollo de SoftwareDesarrollo de Aplicaciones MóvilesDesarrollo de Aplicaciones AndroidCodificaciónAndroidContinuar la discusión