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

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. ViewModel และ LiveData
  2. ฐานข้อมูล Room
  3. โครูทีนและฟังก์ชัน Suspend
  4. รูปแบบ Repository
  5. คอมโพเนนต์ Navigation
  6. การฉีด Dependency ด้วย Hilt
← กลับไปที่ Android Academy