ViewModel และ LiveData
รองรับการเปลี่ยนแปลงการกำหนดค่าด้วย ViewModel เปิดเผยกระแสข้อมูลแบบตอบสนองด้วย LiveData และเฝ้าสังเกตข้อมูลใน Activities และ Fragments
ViewModel และ LiveData เป็นบทเรียน Android Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 6 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Android Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Android Academy มีบทเรียนทั้งหมด 6 บทเรียน
ปัญหาของ Activity
การเก็บข้อมูลไว้โดยตรงใน Activity มีปัญหาสำคัญสองประการ:
- เมื่อผู้ใช้หมุนโทรศัพท์ Activity จะถูก ทำลายและสร้างใหม่ — ข้อมูลทั้งหมดจะสูญหาย
- หากคุณดึงข้อมูลจากเครือข่ายใน
onCreateระบบจะดึงข้อมูลใหม่ทุกครั้งที่หมุนหน้าจอ — สิ้นเปลืองโดยไม่จำเป็น
ViewModel แก้ปัญหาทั้งสองประการนี้
ViewModel คืออะไร
ViewModel เป็นส่วนประกอบสถาปัตยกรรมของ Android ที่:
- คงอยู่ต่อไปแม้การกำหนดค่าจะเปลี่ยนแปลง เช่น การหมุนหน้าจอหรือการเปลี่ยนธีม
- เก็บข้อมูลที่เกี่ยวข้องกับ UI และตรรกะทางธุรกิจ
- จะถูกทำลายเมื่อผู้ใช้ออกจากหน้าจอนั้นอย่างถาวรเท่านั้น
หลักจำง่าย: หากข้อมูลควรคงอยู่หลังการหมุนหน้าจอ ให้เก็บข้อมูลนั้นไว้ใน ViewModel
การสร้าง ViewModel
สืบทอดจาก ViewModel และเพิ่มลงใน Dependency ของ Gradle:
// app/build.gradle:
// implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0'
// implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.7.0'
import androidx.lifecycle.ViewModel
class CounterViewModel : ViewModel() {
var count = 0
private set
fun increment() {
count++
}
fun reset() {
count = 0
}
}การรับ ViewModel ใน Activity
ใช้ ViewModelProvider หรือตัวแทน by viewModels() เพื่อรับอินสแตนซ์ของ ViewModel:
import androidx.activity.viewModels
class CounterActivity : AppCompatActivity() {
private lateinit var binding: ActivityCounterBinding
// Android manages the ViewModel lifecycle — never instantiate it yourself
private val viewModel: CounterViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityCounterBinding.inflate(layoutInflater)
setContentView(binding.root)
// This shows the count is preserved after rotation!
binding.tvCount.text = viewModel.count.toString()
binding.btnPlus.setOnClickListener {
viewModel.increment()
binding.tvCount.text = viewModel.count.toString()
}
}
}LiveData คืออะไร
LiveData คือที่เก็บข้อมูลที่สังเกตการเปลี่ยนแปลงได้ UI จะสังเกตค่าของ LiveData และอัปเดต โดยอัตโนมัติ เมื่อค่าเปลี่ยนแปลง
- ตระหนักถึงวงจรชีวิต — อัปเดตเฉพาะตัวสังเกตที่ทำงานอยู่ จึงไม่เกิดข้อขัดข้องเมื่อ Activity อยู่เบื้องหลัง
- เป็นข้อมูลล่าสุดเสมอ — ตัวสังเกตใหม่จะได้รับค่าล่าสุดทันที
LiveData ใน ViewModel
ใช้ MutableLiveData เป็นการภายใน (ViewModel สามารถเขียนได้) และเปิดเผยเป็น LiveData ต่อสาธารณะ (UI ทำได้เพียงสังเกต):
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class CounterViewModel : ViewModel() {
private val _count = MutableLiveData(0)
val count: LiveData<Int> = _count // read-only for the UI
fun increment() {
_count.value = (_count.value ?: 0) + 1
}
fun reset() {
_count.value = 0
}
}การสังเกต LiveData ใน Activity
เรียก .observe(lifecycleOwner) { value -> } เพื่อโต้ตอบกับการเปลี่ยนแปลง:
class CounterActivity : AppCompatActivity() {
private val viewModel: CounterViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ...
// Automatically updates TextView whenever count changes
viewModel.count.observe(this) { count ->
binding.tvCount.text = count.toString()
}
binding.btnPlus.setOnClickListener { viewModel.increment() }
binding.btnReset.setOnClickListener { viewModel.reset() }
}
}LiveData เทียบกับ State Flow
LiveData เป็นแนวทางแบบดั้งเดิม ส่วนโค้ด Kotlin สมัยใหม่มักใช้ StateFlow จาก Kotlin Coroutines แทน:
StateFlow— ทำงานบนโครูทีนและไม่ขึ้นต่อกับ Android- รวบรวมข้อมูลด้วย
repeatOnLifecycleใน Activity - เหมาะกับการจัดการสถานะที่ซับซ้อนกว่า
ทั้งสองแบบทำงานได้ดี — LiveData เริ่มต้นใช้งานได้ง่ายกว่า ส่วน StateFlow มักพบในแอปขนาดใหญ่
ViewModel ที่มีตัวสังเกตหลายตัว
ส่วนประกอบ UI หลายรายการสามารถสังเกต LiveData เดียวกันได้ ตัวอย่างเช่น TextView และสถานะเปิดใช้งานของ Button สามารถตอบสนองต่อค่าข้อมูลเดียวกันใน ViewModel ได้ โดยไม่ต้องเพิ่มโค้ดใด ๆ ใน ViewModel
วิธีนี้ช่วยแยกหน้าที่ได้อย่างชัดเจน: ViewModel เก็บสถานะ ส่วน UI ทำหน้าที่สังเกตและแสดงผล
ตรวจสอบความเข้าใจ
ViewModel จะถูกทำลายเมื่อใด
ทบทวน: ViewModel และ LiveData
ตอนนี้คุณทราบวิธีสร้าง UI ที่ตระหนักถึงวงจรชีวิตแล้ว:
- ViewModel คงอยู่ต่อไปเมื่อการกำหนดค่าเปลี่ยนแปลง เช่น การหมุนหน้าจอ
- ใช้
by viewModels()เพื่อรับ ViewModel ใน Activity - ใช้รูปแบบ MutableLiveData (ส่วนตัว) / LiveData (สาธารณะ)
- สังเกตการเปลี่ยนแปลงด้วย
.observe(this) { value -> updateUI(value) } - UI อัปเดตโดยอัตโนมัติ — ไม่จำเป็นต้องรีเฟรชด้วยตนเอง
ถัดไป: จัดเก็บข้อมูลอย่างถาวรด้วยฐานข้อมูล Room
คำถามที่พบบ่อย
บทเรียน “ViewModel และ LiveData” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ViewModel และ LiveData” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Android Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Android Academy มีบทเรียนทั้งหมด 6 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ViewModel และ LiveData”
รองรับการเปลี่ยนแปลงการกำหนดค่าด้วย ViewModel เปิดเผยกระแสข้อมูลแบบตอบสนองด้วย LiveData และเฝ้าสังเกตข้อมูลใน Activities และ Fragments คุณปฏิบัติ Android Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Android Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Android Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 6 บทเรียน
บทเรียน “ViewModel และ LiveData” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Android Academy นี้ได้ไหม
ได้ บทเรียน Android Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ViewModel และ LiveData
- ฐานข้อมูล Room
- โครูทีนและฟังก์ชัน Suspend
- รูปแบบ Repository
- คอมโพเนนต์ Navigation
- การฉีด Dependency ด้วย Hilt