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