0Pricing
Android Academy · บทเรียน

การจัดการข้อผิดพลาดและประสบการณ์ผู้ใช้

จำลองสถานะส่วนติดต่อผู้ใช้ด้วยคลาสแบบปิด (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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. Retrofit และ REST APIs
  2. การโหลดรูปภาพด้วย Coil
  3. การจัดการข้อผิดพลาดและประสบการณ์ผู้ใช้
  4. การแจ้งเตือนแบบพุช
  5. WorkManager และงานเบื้องหลัง
  6. การเผยแพร่ไปยัง Play Store
← กลับไปที่ Android Academy