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

collectAsStateWithLifecycle

รวบรวมโฟลว์อย่างปลอดภัยตามวงจรชีวิต

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

การรวบรวมโฟลว์อย่างปลอดภัย

เมื่อคอมโพสิเบิลรวบรวมโฟลว์ ควรหยุดรวบรวมขณะที่หน้าจออยู่เบื้องหลัง และกลับมารวบรวมต่อเมื่อหน้าจอกลับมาแสดง

เครื่องมือสำหรับงานนี้คือ collectAsStateWithLifecycle()

ปัญหาของ collectAsState

collectAsState() แบบทั่วไปจะรวบรวมต่อไปตราบใดที่คอมโพสิเบิลยังอยู่ในคอมโพสิชัน — แม้แอปจะอยู่เบื้องหลังก็ตาม

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

เริ่มใช้ collectAsStateWithLifecycle

ตัวรวบรวมที่คำนึงถึงวงจรชีวิตนี้จะหยุดการรวบรวมเมื่อวงจรชีวิตต่ำกว่าสถานะเป้าหมาย (ค่าเริ่มต้นคือ STARTED) และกลับมารวบรวมต่อเมื่อวงจรชีวิตกลับถึงสถานะดังกล่าว

import androidx.lifecycle.compose.collectAsStateWithLifecycle

@Composable
fun Screen(vm: MyViewModel) {
    val state by vm.uiState
        .collectAsStateWithLifecycle()
    Text(state.title)
}

ส่วนพึ่งพา

สิ่งนี้อยู่ในอาร์ทิแฟกต์ androidx.lifecycle:lifecycle-runtime-compose ให้เพิ่มอาร์ทิแฟกต์นี้ลงในมอดูลของคุณเพื่อให้การนำเข้าใช้งานได้

// build.gradle (module)
implementation(
  "androidx.lifecycle:lifecycle-runtime-compose:2.x.x"
)

สถานะขั้นต่ำเริ่มต้น: STARTED

โดยค่าเริ่มต้น การรวบรวมจะทำงานขณะที่วงจรชีวิตอยู่ที่ STARTED เป็นอย่างน้อย — หมายความว่าหน้าจอกำลังแสดงอยู่ เมื่อแอปไปอยู่เบื้องหลัง (ต่ำกว่า STARTED) การรวบรวมจะถูกระงับ

การกำหนดสถานะขั้นต่ำเอง

คุณสามารถเปลี่ยนเกณฑ์ได้ด้วย minActiveState เช่น เปลี่ยนเป็น RESUMED

val state by vm.uiState.collectAsStateWithLifecycle(
    minActiveState = Lifecycle.State.RESUMED
)

การใช้ร่วมกับ StateFlow

สิ่งนี้ทำงานร่วมกับ StateFlow ที่คุณเปิดเผยจาก ViewModel ได้อย่างเหมาะสม โฟลว์จะมีค่าปัจจุบันอยู่เสมอ ดังนั้นเมื่อกลับมารวบรวมอีกครั้ง จะแสดงสถานะล่าสุดทันที

private val _uiState = MutableStateFlow(UiState())
val uiState = _uiState.asStateFlow()

เหตุผลที่ช่วยลดการทำงาน

หากโฟลว์ของคุณขับเคลื่อนการคำนวณที่ใช้ทรัพยากรมาก (เช่น การกรองรายการขนาดใหญ่หรือการแปลงสตรีม) การระงับการรวบรวมขณะอยู่เบื้องหลังหมายความว่างานดังกล่าวจะไม่ทำงานในขณะที่ผู้ใช้ไม่อยู่

การใช้ร่วมกับ viewModelScope

ในฝั่งผู้ผลิต ViewModel มักเรียกใช้ไปป์ไลน์ข้อมูลภายใน viewModelScope และด้วย stateIn คุณยังสามารถทำให้ต้นทางหยุดทำงานเมื่อไม่มีตัวรวบรวมได้อีกด้วย

val uiState = repository.stream()
    .stateIn(
        scope = viewModelScope,
        started = SharingStarted.WhileSubscribed(5000),
        initialValue = UiState()
    )

อธิบาย WhileSubscribed

WhileSubscribed(5000) จะทำให้ต้นทางทำงานต่ออีก 5 วินาทีหลังจากตัวรวบรวมตัวสุดท้ายออกไป ซึ่งช่วยหลีกเลี่ยงการเริ่มงานใหม่ระหว่างการเปลี่ยนแปลงการกำหนดค่าเพียงชั่วครู่ และยังคงหยุดงานเมื่อผู้ใช้ออกจากหน้าจอจริง ๆ

สรุปแนวปฏิบัติที่ดี

สำหรับหน้าจอ Compose ที่มี ViewModel อยู่เบื้องหลัง:

  • เปิดเผย StateFlow
  • รวบรวมด้วย collectAsStateWithLifecycle()
  • เลือกใช้ stateIn(WhileSubscribed) ที่ต้นทางได้

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจเกี่ยวกับการรวบรวมที่คำนึงถึงวงจรชีวิต

สรุปทบทวน

สิ่งที่คุณได้เรียนรู้:

  • collectAsStateWithLifecycle() จะหยุดการรวบรวมขณะอยู่เบื้องหลัง
  • เกณฑ์เริ่มต้นคือ STARTED และปรับได้ผ่าน minActiveState
  • ใช้ร่วมกับ StateFlow และ stateIn(WhileSubscribed) เพื่อสร้างไปป์ไลน์ที่มีประสิทธิภาพ

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

บทเรียน “collectAsStateWithLifecycle” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “collectAsStateWithLifecycle”

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

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

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

บทเรียน “collectAsStateWithLifecycle” ใช้เวลานานแค่ไหน

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

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

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

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

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