0Pricing
Android Academy · Урок

Обработка ошибок и UX

Моделируйте состояния интерфейса с помощью запечатанных классов (Loading/Success/Error). Показывайте ProgressBar и Snackbar с действиями Retry, а также ошибки проверки в TextInputLayout.

«Обработка ошибок и UX» — бесплатный урок Android Academy на CoddyKit. Это урок 3 из 6. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 6 уроков всего.

Почему важна обработка ошибок

Приложения, которые без объяснений завершают работу или зависают, кажутся неисправными. Пользователи не понимают, что произошло и что делать дальше.

Хорошая обработка ошибок означает, что:

  • приложение остаётся стабильным;
  • пользователи получают понятное сообщение;
  • они могут повторить попытку или выполнить нужное действие.

Именно это отличает оценку приложения в 2 звезды от оценки в 5 звёзд.

Моделирование состояния интерфейса

Удобный шаблон: смоделируйте все возможные состояния интерфейса с помощью запечатанного класса:

  • Loading — запрос выполняется
  • Success(data) — данные доступны
  • Error(message) — произошла ошибка

ViewModel выдаёт одно из этих состояний, а интерфейс его отображает.

Запечатанный класс UiState

Определите запечатанный класс для всех возможных состояний:

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

Отображение состояния в интерфейсе

Наблюдайте за состоянием и показывайте подходящее представление для каждого случая:

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 во время загрузки

Показывайте ProgressBar, пока ожидаете данные:

  • Используйте android:indeterminate="true" для вращающегося индикатора загрузки
  • Переключайте видимость между View.VISIBLE и View.GONE
  • GONE удаляет представление из макета (а не просто делает его невидимым — оно не занимает место)

Snackbar и Toast

Для сообщений об ошибках предпочитайте Snackbar, а не Toast:

  • Snackbar может содержать кнопку действия (например, «Повторить»)
  • Он прикреплён к текущему экрану и не перекрывает другие приложения
  • Он закрывается автоматически или после нажатия

Snackbar с повторной попыткой

Покажите ошибку с кнопкой действия «Повторить»:

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

Проверка ввода

Проверяйте введённые пользователем данные перед отправкой на сервер:

  • Используйте TextInputLayout со свойством error, чтобы показывать ошибки непосредственно под полем
  • Проверяйте пустые поля, формат электронной почты и длину пароля перед вызовом API
  • Очищайте ошибки, когда пользователь начинает вводить текст

Ошибка TextInputLayout

Показывайте ошибки проверки непосредственно в полях формы:

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

Быстрая проверка

Какое состояние видимости представления полностью удаляет его из макета, не занимая места?

Итоги: обработка ошибок и удобство использования

Теперь Ваши приложения умеют корректно обрабатывать ошибки:

  • Моделировать состояния Loading / Success / Error с помощью запечатанного класса
  • Показывать ProgressBar во время загрузки
  • Использовать Snackbar с действием Retry для сетевых ошибок
  • Показывать ошибки проверки формы непосредственно в TextInputLayout
  • Различать View.GONE и View.INVISIBLE: удалять представление или скрывать его

Заключительный урок: опубликуйте приложение в Play Store!

Часто задаваемые вопросы

Урок «Обработка ошибок и UX» бесплатный?

Да — полный текст урока «Обработка ошибок и UX» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 6 уроков всего.

Чему я научусь в уроке «Обработка ошибок и UX»?

Моделируйте состояния интерфейса с помощью запечатанных классов (Loading/Success/Error). Показывайте ProgressBar и Snackbar с действиями Retry, а также ошибки проверки в TextInputLayout. Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Android Academy?

Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 6.

Сколько времени занимает урок «Обработка ошибок и UX»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Android Academy?

Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Retrofit и REST API
  2. Загрузка изображений с Coil
  3. Обработка ошибок и UX
  4. Push-уведомления
  5. WorkManager и фоновые задачи
  6. Публикация в Play Store
← Назад к Android Academy