Android Academy · Lektion

Fejlhåndtering og UX

Modellér UI-tilstande med sealed classes (Loading/Success/Error). Vis ProgressBar og Snackbar med Retry-handlinger, og validér fejl inline med TextInputLayout.

Lektion 3 af 611 trin

Fejlhåndtering og UX er en gratis Android Academy-lektion på CoddyKit. Dette er lektion 3 af 6. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Android Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Android Academy-kurset indeholder 6 lektioner i alt.

Hvorfor fejlhåndtering er vigtig

Apps, der går ned eller fryser uden forklaring, virker ødelagte. Brugerne ved ikke, hvad der skete, eller hvad de skal gøre nu.

God fejlhåndtering betyder:

  • Appen forbliver stabil
  • Brugerne får en tydelig besked
  • De kan prøve igen eller foretage en handling

Det er forskellen på en appanmeldelse med 2 stjerner og en med 5 stjerner.

Modellering af UI-tilstand

Et enkelt mønster er at modellere alle mulige UI-tilstande med en sealed class:

  • Loading — forespørgslen er i gang
  • Success(data) — data er tilgængelige
  • Error(message) — noget gik galt

ViewModel udsender en af disse tilstande, og brugergrænsefladen gengiver den.

Sealed class UiState

Definér en sealed class for alle mulige tilstande:

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

Gengivelse af tilstand i brugergrænsefladen

Observer tilstanden, og vis den rigtige visning for hvert tilfælde:

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 under indlæsning

Vis en ProgressBar, mens du venter på data:

  • Brug android:indeterminate="true" til en animeret indlæsningsindikator
  • Skift synligheden mellem View.VISIBLE og View.GONE
  • GONE fjerner visningen fra layoutet (den bliver ikke bare usynlig — den optager ingen plads)

Snackbar kontra Toast

Foretræk Snackbar frem for Toast til fejlbeskeder:

  • Snackbar kan have en handlingsknap (f.eks. "Prøv igen")
  • Den er knyttet til den aktuelle skærm og svæver ikke over andre apps
  • Den lukkes automatisk eller ved tryk

Snackbar med Prøv igen

Vis en fejl med handlingsknappen Prøv igen:

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

Validering af input

Validér brugerens input, før du sender det til serveren:

  • Brug TextInputLayout med egenskaben error til at vise indlejrede fejl under feltet
  • Kontrollér tomme felter, e-mailformat og adgangskodens længde, før du kalder API'et
  • Ryd fejlene, når brugeren begynder at skrive

Fejl i TextInputLayout

Vis indlejrede valideringsfejl i formularfelter:

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

Hurtigt tjek

Hvilken synlighedstilstand for en visning fjerner den helt fra layoutet, så den ikke optager plads?

Opsummering: Fejlhåndtering og UX

Dine apps kan nu håndtere fejl på en god måde:

  • Modellér tilstanden som Loading / Success / Error med en sealed class
  • Vis en ProgressBar under indlæsning
  • Snackbar med handlingen Prøv igen ved netværksfejl
  • Indlejrede TextInputLayout-fejl til formularvalidering
  • View.GONE kontra View.INVISIBLE — fjern kontra skjul

Sidste lektion: Udgiv din app i Play Store!

Gratis at komme i gang

Lær Kotlin med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
36
Lektioner
152

Ofte stillede spørgsmål

Er lektionen “Fejlhåndtering og UX” gratis?

Ja — alle 3 lektioner i læringssporet Android Academy, inklusive “Fejlhåndtering og UX”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Android Academy-kurset indeholder 6 lektioner i alt.

Hvad lærer jeg i “Fejlhåndtering og UX”?

Modellér UI-tilstande med sealed classes (Loading/Success/Error). Vis ProgressBar og Snackbar med Retry-handlinger, og validér fejl inline med TextInputLayout. Du øver dig i Android Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Android Academy?

Der kræves ingen tidligere erfaring. Android Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 6.

Hvor lang tid tager lektionen “Fejlhåndtering og UX”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Android Academy-lektion?

Ja. Alle Android Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Retrofit og REST-API'er
  2. Indlæsning af billeder med Coil
  3. Fejlhåndtering og UX
  4. Push-notifikationer
  5. WorkManager og baggrundsopgaver
  6. Udgivelse i Play Store
← Tilbage til Android Academy