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