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

เหตุใดจึงควรใช้ ViewModel

รองรับการเปลี่ยนแปลงการกำหนดค่าได้อย่างเหมาะสม

เหตุใดจึงควรใช้ ViewModel เป็นบทเรียน Android Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Android Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Android Academy มีบทเรียนทั้งหมด 4 บทเรียน

ViewModel คืออะไร

ViewModel คือส่วนประกอบสถาปัตยกรรมของ Android ที่ออกแบบมาเพื่อจัดเก็บและจัดการข้อมูลที่เกี่ยวข้องกับส่วนติดต่อผู้ใช้โดยคำนึงถึงวงจรชีวิต

โดยจะคงอยู่เมื่อเกิดการเปลี่ยนแปลงการกำหนดค่า เช่น การหมุนหน้าจอ ทำให้ข้อมูลไม่ถูกทำลายและสร้างใหม่ทุกครั้งที่ระบบสร้างส่วนติดต่อผู้ใช้ขึ้นใหม่

ปัญหาการเปลี่ยนแปลงการกำหนดค่า

เมื่อคุณหมุนอุปกรณ์ Android จะทำลายและสร้าง Activity ขึ้นใหม่ สถานะใด ๆ ที่เก็บอยู่ภายใน Activity หรือ Composable จะสูญหาย

  • ตัวนับจะกลับเป็นศูนย์
  • รายการที่โหลดไว้จะหายไป
  • คำขอเครือข่ายอาจเริ่มต้นใหม่

ViewModel แก้ปัญหานี้ด้วยการอยู่นอกวงจรชีวิตของอินสแตนซ์ Activity

ViewModel คงอยู่ได้อย่างไร

เฟรมเวิร์กจะทำให้อินสแตนซ์ ViewModel เดิมยังคงอยู่ระหว่างการสร้างใหม่ เมื่อสร้าง Activity ใหม่ ระบบจะส่ง ViewModel เดิมให้ แทนที่จะสร้างอินสแตนซ์ใหม่

class CounterViewModel : ViewModel() {
    var count = 0
        private set

    fun increment() {
        count++
    }
}

รับ ViewModel ใน Compose

ใน Jetpack Compose โดยทั่วไปคุณจะรับ ViewModel ด้วยตัวช่วย viewModel() ซึ่งจะคืนอินสแตนซ์เดิมสำหรับเจ้าของวงจรชีวิตนั้น

import androidx.lifecycle.viewmodel.compose.viewModel

@Composable
fun CounterScreen(
    vm: CounterViewModel = viewModel()
) {
    Text("Count: " + vm.count)
}

การแยกหน้าที่

ViewModel ช่วยส่งเสริมการแบ่งส่วนอย่างเป็นระเบียบ:

  • ชั้นส่วนติดต่อผู้ใช้ (Composables/Activities) มีหน้าที่แสดงสถานะและส่งต่อเหตุการณ์เท่านั้น
  • ViewModel เก็บสถานะและตรรกะทางธุรกิจ

ทำให้ส่วนติดต่อผู้ใช้มีความซับซ้อนน้อยลง และทำให้ตรรกะทดสอบได้ง่ายขึ้น

ขอบเขตและเจ้าของ ViewModel

ViewModel จะอยู่ภายใต้ขอบเขตของ ViewModelStoreOwner ซึ่งโดยปกติคือ Activity, Fragment หรือรายการในสแตกย้อนกลับของการนำทาง

ระบบจะล้าง ViewModel โดยอัตโนมัติเมื่อเจ้าของถูกทำลายอย่างถาวร เช่น เมื่อผู้ใช้จบการทำงานของ Activity ด้วยการกดย้อนกลับ

การเรียกกลับ onCleared

เมื่อ ViewModel ถูกทำลายในที่สุด เฟรมเวิร์กจะเรียกใช้ onCleared() ให้ใช้ฟังก์ชันนี้เพื่อคืนทรัพยากรที่คุณเปิดใช้งานไว้

class MyViewModel : ViewModel() {
    override fun onCleared() {
        super.onCleared()
        // cancel jobs, close listeners
    }
}

สิ่งที่ไม่ควรใส่ใน ViewModel

อย่าเก็บการอ้างอิงไปยัง Views, Activities หรือ Context ใด ๆ ที่ผูกกับส่วนติดต่อผู้ใช้ไว้ใน ViewModel เนื่องจาก ViewModel มีอายุยืนยาวกว่า Activity การทำเช่นนี้จะทำให้เกิดหน่วยความจำรั่ว

หากต้องใช้ application context ให้ใช้ AndroidViewModel แทน

AndroidViewModel สำหรับบริบทของแอป

เมื่อคุณจำเป็นต้องใช้ Context จริง ๆ ให้สืบทอดจาก AndroidViewModel ซึ่งจัดเตรียมบริบทของแอปพลิเคชันที่มีอายุยืนยาวให้ได้อย่างปลอดภัย

class PrefsViewModel(
    app: Application
) : AndroidViewModel(app) {
    private val context = getApplication<Application>()
}

ส่งอาร์กิวเมนต์ให้ตัวสร้าง

หากต้องการแทรกการพึ่งพา เช่น คลังข้อมูล ลงใน ViewModel ให้ใช้ ViewModelFactory หรือเฟรมเวิร์ก DI เช่น Hilt เราจะกล่าวถึง Hilt ในภายหลังของบทเรียนชุดนี้

class UserViewModel(
    private val repo: UserRepository
) : ViewModel() {
    // repo provided via a factory or Hilt
}

เหตุผลที่ ViewModel สำคัญ

ViewModel เป็นรากฐานสำคัญของสถาปัตยกรรม Android สมัยใหม่ โดยช่วยให้คุณมี:

  • การคงอยู่เมื่อการกำหนดค่าเปลี่ยนแปลง
  • การแยกส่วนติดต่อผู้ใช้ออกจากตรรกะอย่างชัดเจน
  • การจัดการสถานะที่คาดเดาได้และทดสอบได้

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจของคุณเกี่ยวกับเหตุผลที่ใช้ ViewModel

สรุปทบทวน

คุณได้เรียนรู้ว่า:

  • ViewModel จัดเก็บสถานะของส่วนติดต่อผู้ใช้และคงอยู่เมื่อการกำหนดค่าเปลี่ยนแปลง
  • ต้องไม่เก็บการอ้างอิงไปยัง View หรือ Activity เพื่อป้องกันหน่วยความจำรั่ว
  • ViewModel อยู่ภายใต้ขอบเขตของเจ้าของ และถูกล้างผ่าน onCleared()
  • AndroidViewModel มอบ Context ของแอปพลิเคชันที่ปลอดภัย

คำถามที่พบบ่อย

บทเรียน “เหตุใดจึงควรใช้ ViewModel” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “เหตุใดจึงควรใช้ ViewModel” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Android Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Android Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “เหตุใดจึงควรใช้ ViewModel”

รองรับการเปลี่ยนแปลงการกำหนดค่าได้อย่างเหมาะสม คุณปฏิบัติ Android Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Android Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Android Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “เหตุใดจึงควรใช้ ViewModel” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Android Academy นี้ได้ไหม

ได้ บทเรียน Android Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. เหตุใดจึงควรใช้ ViewModel
  2. การเปิดเผยสถานะจาก ViewModel
  3. วงจรชีวิตของ Android
  4. collectAsStateWithLifecycle
← กลับไปที่ Android Academy