0Pricing
Android Academy · Lección

Gestión de errores y UX

Modele los estados de la interfaz con clases sealed (Loading/Success/Error). Muestre ProgressBar, Snackbar con acciones Retry y errores de validación en línea de TextInputLayout.

Gestión de errores y UX es una lección gratuita de Android Academy en CoddyKit. Esta es la lección 3 de 6. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Android Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Android Academy incluye 6 lecciones en total.

Por qué es importante gestionar los errores

Las aplicaciones que se bloquean o se congelan sin explicación parecen defectuosas. Los usuarios no saben qué ha ocurrido ni qué deben hacer después.

Una buena gestión de errores significa:

  • La aplicación se mantiene estable
  • Los usuarios reciben un mensaje claro
  • Pueden volver a intentarlo o realizar una acción

Esta es la diferencia entre una valoración de 2 estrellas y una de 5 estrellas.

Modelado del estado de la interfaz

Un patrón claro consiste en modelar todos los estados posibles de la interfaz con una sealed class:

  • Loading — la solicitud está en curso
  • Success(data) — los datos están disponibles
  • Error(message) — algo ha salido mal

El ViewModel emite uno de estos estados y la interfaz lo representa.

Sealed Class UiState

Defina una sealed class para todos los estados posibles:

sealed class UiState<out T> {
    object Loading : UiState<Nothing>()
    data class Success<T>(val data: T) : UiState<T>()
    data class Error(val message: String) : UiState<Nothing>()
}

// In ViewModel:
private val _state = MutableLiveData<UiState<List<Post>>>()
val state: LiveData<UiState<List<Post>>> = _state

fun loadPosts() {
    _state.value = UiState.Loading
    viewModelScope.launch {
        try {
            val posts = withContext(Dispatchers.IO) { repo.getPosts() }
            _state.value = UiState.Success(posts)
        } catch (e: Exception) {
            _state.value = UiState.Error(e.message ?: "Unknown error")
        }
    }
}

Representación del estado en la interfaz

Observe el estado y muestre la vista adecuada para cada caso:

viewModel.state.observe(this) { state ->
    when (state) {
        is UiState.Loading -> {
            binding.progressBar.visibility = View.VISIBLE
            binding.recyclerView.visibility = View.GONE
            binding.tvError.visibility = View.GONE
        }
        is UiState.Success -> {
            binding.progressBar.visibility = View.GONE
            binding.recyclerView.visibility = View.VISIBLE
            adapter.submitList(state.data)
        }
        is UiState.Error -> {
            binding.progressBar.visibility = View.GONE
            binding.tvError.text = state.message
            binding.tvError.visibility = View.VISIBLE
        }
    }
}

ProgressBar durante la carga

Muestre una ProgressBar mientras espera los datos:

  • Use android:indeterminate="true" para mostrar un indicador giratorio
  • Alterne la visibilidad entre View.VISIBLE y View.GONE
  • GONE elimina la vista del diseño; no solo la hace invisible, sino que además deja de ocupar espacio

Snackbar frente a Toast

Prefiera Snackbar en lugar de Toast para los mensajes de error:

  • Snackbar puede incluir un botón de acción, como "Reintentar"
  • Está vinculada a la pantalla actual y no flota sobre otras aplicaciones
  • Desaparece automáticamente o al tocarla

Snackbar con reintento

Muestre un error con un botón de acción para reintentar:

import com.google.android.material.snackbar.Snackbar

fun showError(message: String) {
    Snackbar.make(
        binding.root,  // root view of the screen
        message,
        Snackbar.LENGTH_INDEFINITE  // stays until dismissed
    ).setAction("Retry") {
        viewModel.loadPosts()  // retry the request
    }.show()
}

Validación de entradas

Valide los datos introducidos por el usuario antes de enviarlos al servidor:

  • Use TextInputLayout con la propiedad error para mostrar errores integrados debajo del campo
  • Compruebe los campos vacíos, el formato del correo electrónico y la longitud de la contraseña antes de llamar a la API
  • Borre los errores cuando el usuario empiece a escribir

Error de TextInputLayout

Muestre errores de validación integrados en los campos del formulario:

fun validateAndSubmit() {
    val email = binding.etEmail.text.toString().trim()
    val password = binding.etPassword.text.toString()

    var hasError = false

    if (email.isBlank() || !email.contains("@")) {
        binding.tilEmail.error = "Enter a valid email"
        hasError = true
    } else {
        binding.tilEmail.error = null  // clear error
    }

    if (password.length < 6) {
        binding.tilPassword.error = "Minimum 6 characters"
        hasError = true
    } else {
        binding.tilPassword.error = null
    }

    if (!hasError) viewModel.login(email, password)
}

Comprobación rápida

¿Qué estado de visibilidad de una vista la elimina completamente del diseño, de modo que no ocupa espacio?

Repaso: gestión de errores y UX

Ahora sus aplicaciones pueden gestionar los errores correctamente:

  • Modelar el estado como Loading / Success / Error con una sealed class
  • Mostrar una ProgressBar durante la carga
  • Usar Snackbar con una acción de reintento para los errores de red
  • Usar errores integrados de TextInputLayout para validar formularios
  • View.GONE frente a View.INVISIBLE: eliminar frente a ocultar

Lección final: publique su aplicación en Play Store.

Preguntas frecuentes

¿La lección «Gestión de errores y UX» es gratis?

Sí — el texto completo de «Gestión de errores y UX» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Android Academy, actualiza a CoddyKit PRO. El curso de Android Academy incluye 6 lecciones en total.

¿Qué aprenderé en «Gestión de errores y UX»?

Modele los estados de la interfaz con clases sealed (Loading/Success/Error). Muestre ProgressBar, Snackbar con acciones Retry y errores de validación en línea de TextInputLayout. Practicas Android Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Android Academy?

No se requiere experiencia previa. Android Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 6.

¿Cuánto tiempo toma la lección «Gestión de errores y UX»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Android Academy?

Sí. Cada lección de Android Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Retrofit y API REST
  2. Carga de imágenes con Coil
  3. Gestión de errores y UX
  4. Notificaciones push
  5. WorkManager y tareas en segundo plano
  6. Publicación en Play Store
← Volver a Android Academy