การจัดการข้อผิดพลาดและประสบการณ์ผู้ใช้
จำลองสถานะส่วนติดต่อผู้ใช้ด้วยคลาสแบบปิด (Loading/Success/Error) แสดง ProgressBar และ Snackbar พร้อมการดำเนินการ Retry รวมถึงข้อผิดพลาดจากการตรวจสอบในบรรทัดด้วย TextInputLayout
การจัดการข้อผิดพลาดและประสบการณ์ผู้ใช้ เป็นบทเรียน Android Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 6 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Android Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Android Academy มีบทเรียนทั้งหมด 6 บทเรียน
เหตุใดการจัดการข้อผิดพลาดจึงสำคัญ
แอปที่หยุดทำงานหรือค้างโดยไม่อธิบายสาเหตุจะทำให้ผู้ใช้รู้สึกว่าแอปเสีย ผู้ใช้ไม่ทราบว่าเกิดอะไรขึ้นหรือควรทำอย่างไรต่อ
การจัดการข้อผิดพลาดที่ดีหมายความว่า:
- แอปยังคงทำงานได้อย่างเสถียร
- ผู้ใช้ได้รับข้อความที่ชัดเจน
- ผู้ใช้สามารถลองใหม่หรือดำเนินการต่อได้
สิ่งนี้คือความแตกต่างระหว่างรีวิวแอป 2 ดาวกับ 5 ดาว
การสร้างแบบจำลองสถานะ UI
รูปแบบที่สะอาดและเป็นระเบียบคือ สร้างแบบจำลองสถานะ UI ที่เป็นไปได้ทั้งหมดด้วย sealed class:
Loading— คำขอกำลังดำเนินการSuccess(data)— มีข้อมูลพร้อมใช้งานError(message)— เกิดข้อผิดพลาดบางอย่าง
ViewModel จะส่งสถานะใดสถานะหนึ่งเหล่านี้ออกมา และ UI จะแสดงผลตามสถานะนั้น
Sealed Class UiState
กำหนด sealed class สำหรับสถานะที่เป็นไปได้ทั้งหมด:
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")
}
}
}การแสดงสถานะใน UI
สังเกตสถานะและแสดงมุมมองที่ถูกต้องสำหรับแต่ละกรณี:
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 สำหรับ Loading
แสดง ProgressBar ระหว่างรอข้อมูล:
- ใช้
android:indeterminate="true"สำหรับตัวโหลดแบบหมุน - สลับการมองเห็นระหว่าง
View.VISIBLEและView.GONE GONEจะนำมุมมองออกจากเค้าโครง ไม่ใช่เพียงซ่อนเท่านั้น เพราะจะไม่กินพื้นที่
Snackbar เทียบกับ Toast
ควรใช้ Snackbar แทน Toast สำหรับข้อความข้อผิดพลาด:
- Snackbar สามารถมีปุ่มการทำงาน เช่น "ลองใหม่"
- 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)
}ตรวจสอบความเข้าใจ
สถานะการมองเห็นใดของมุมมองที่จะนำมุมมองออกจากเค้าโครงโดยสมบูรณ์และไม่ใช้พื้นที่
สรุป: การจัดการข้อผิดพลาดและ UX
ขณะนี้แอปของคุณสามารถจัดการข้อผิดพลาดได้อย่างเหมาะสมแล้ว:
- สร้างแบบจำลองสถานะเป็น Loading / Success / Error ด้วย sealed class
- แสดง ProgressBar ระหว่างการโหลด
- ใช้ Snackbar พร้อมการทำงานสำหรับลองใหม่เมื่อเกิดข้อผิดพลาดจากเครือข่าย
- ใช้ข้อผิดพลาดในบรรทัดของ TextInputLayout สำหรับตรวจสอบแบบฟอร์ม
View.GONEเทียบกับView.INVISIBLE— นำออกเทียบกับซ่อน
บทเรียนสุดท้าย: เผยแพร่แอปของคุณไปยัง Play Store!
คำถามที่พบบ่อย
บทเรียน “การจัดการข้อผิดพลาดและประสบการณ์ผู้ใช้” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การจัดการข้อผิดพลาดและประสบการณ์ผู้ใช้” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Android Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Android Academy มีบทเรียนทั้งหมด 6 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การจัดการข้อผิดพลาดและประสบการณ์ผู้ใช้”
จำลองสถานะส่วนติดต่อผู้ใช้ด้วยคลาสแบบปิด (Loading/Success/Error) แสดง ProgressBar และ Snackbar พร้อมการดำเนินการ Retry รวมถึงข้อผิดพลาดจากการตรวจสอบในบรรทัดด้วย TextInputLayout คุณปฏิบัติ Android Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Android Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Android Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 6 บทเรียน
บทเรียน “การจัดการข้อผิดพลาดและประสบการณ์ผู้ใช้” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Android Academy นี้ได้ไหม
ได้ บทเรียน Android Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Retrofit และ REST APIs
- การโหลดรูปภาพด้วย Coil
- การจัดการข้อผิดพลาดและประสบการณ์ผู้ใช้
- การแจ้งเตือนแบบพุช
- WorkManager และงานเบื้องหลัง
- การเผยแพร่ไปยัง Play Store