Обработка ошибок и 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 — локальная установка не требуется.
Все уроки этого курса
- Retrofit и REST API
- Загрузка изображений с Coil
- Обработка ошибок и UX
- Push-уведомления
- WorkManager и фоновые задачи
- Публикация в Play Store