0Pricing
Android Academy · Lekcja

Obsługa błędów i UX

Modeluj stany interfejsu za pomocą klas sealed (Loading/Success/Error). Wyświetlaj ProgressBar, Snackbar z akcjami Retry oraz osadzone błędy walidacji TextInputLayout.

Obsługa błędów i UX to bezpłatna lekcja Android Academy na CoddyKit. To lekcja 3 z 6. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Android Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Android Academy zawiera 6 lekcji w sumie.

Dlaczego obsługa błędów ma znaczenie

Aplikacje, które bez wyjaśnienia ulegają awarii lub zawieszają się, sprawiają wrażenie niedopracowanych. Użytkownicy nie wiedzą, co się stało ani co zrobić dalej.

Dobra obsługa błędów oznacza, że:

  • Aplikacja pozostaje stabilna
  • Użytkownicy otrzymują jasny komunikat
  • Mogą ponowić próbę lub podjąć działanie

To właśnie różnica między oceną aplikacji na 2 a oceną na 5 gwiazdek.

Modelowanie stanu interfejsu

Przejrzysty wzorzec polega na zamodelowaniu wszystkich możliwych stanów interfejsu za pomocą sealed class:

  • Loading — żądanie jest w toku
  • Success(data) — dane są dostępne
  • Error(message) — wystąpił problem

ViewModel emituje jeden z tych stanów, a interfejs go wyświetla.

Sealed class UiState

Zdefiniuj sealed class dla wszystkich możliwych stanów:

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")
        }
    }
}

Wyświetlanie stanu w interfejsie

Obserwuj stan i wyświetlaj odpowiedni widok dla każdego przypadku:

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 podczas ładowania

Wyświetl ProgressBar podczas oczekiwania na dane:

  • Użyj android:indeterminate="true" dla obracającego się wskaźnika ładowania
  • Przełączaj widoczność między View.VISIBLE a View.GONE
  • GONE usuwa widok z układu (nie tylko go ukrywa — widok nie zajmuje miejsca)

Snackbar a Toast

W przypadku komunikatów o błędach preferuj Snackbar zamiast Toast:

  • Snackbar może zawierać przycisk akcji (np. „Retry”)
  • Jest powiązany z bieżącym ekranem — nie unosi się nad innymi aplikacjami
  • Jest automatycznie zamykany lub znika po dotknięciu

Snackbar z ponawianiem próby

Wyświetl błąd z przyciskiem akcji Retry:

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()
}

Walidacja danych wejściowych

Sprawdzaj dane wprowadzone przez użytkownika przed wysłaniem ich do serwera:

  • Użyj TextInputLayout z właściwością error, aby wyświetlać błędy bezpośrednio pod polem
  • Przed wywołaniem API sprawdź puste pola, format adresu e-mail i długość hasła
  • Usuwaj komunikaty o błędach, gdy użytkownik zaczyna pisać

Błąd TextInputLayout

Wyświetlaj błędy walidacji bezpośrednio przy polach formularza:

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)
}

Szybkie sprawdzenie

Który stan widoczności widoku całkowicie usuwa go z układu, tak że nie zajmuje miejsca?

Podsumowanie: obsługa błędów i UX

Państwa aplikacje potrafią już poprawnie obsługiwać błędy:

  • Modelowanie stanu jako Loading / Success / Error za pomocą sealed class
  • Wyświetlanie ProgressBar podczas ładowania
  • Snackbar z akcją Retry w przypadku błędów sieci
  • Błędy walidacji bezpośrednio przy polach TextInputLayout
  • View.GONE a View.INVISIBLE — usuwanie a ukrywanie

Ostatnia lekcja: opublikujemy aplikację w Sklepie Play!

Często zadawane pytania

Czy lekcja „Obsługa błędów i UX” jest bezpłatna?

Tak — pełny tekst „Obsługa błędów i UX” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Android Academy, przejdź na CoddyKit PRO. Kurs Android Academy zawiera 6 lekcji w sumie.

Co nauczysz się w „Obsługa błędów i UX”?

Modeluj stany interfejsu za pomocą klas sealed (Loading/Success/Error). Wyświetlaj ProgressBar, Snackbar z akcjami Retry oraz osadzone błędy walidacji TextInputLayout. Ćwiczysz Android Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Android Academy?

Nie wymagamy żadnego doświadczenia. Android Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 6.

Ile czasu zajmuje lekcja „Obsługa błędów i UX”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Android Academy?

Tak. Każda lekcja Android Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Retrofit i interfejsy REST API
  2. Ładowanie obrazów za pomocą Coil
  3. Obsługa błędów i UX
  4. Powiadomienia push
  5. WorkManager i zadania w tle
  6. Publikowanie w Play Store
← Powrót do Android Academy