Home API เวอร์ชัน Kotlin ใช้ flows ซึ่งเป็นฟีเจอร์ของภาษา Kotlin ที่มอบความสามารถอันทรงประสิทธิภาพในการจัดการสตรีมข้อมูลแบบอะซิงโครนัส ซึ่งรวมถึงการเปลี่ยนรูปแบบ การกรอง การแมป การแปลงจากและไปยังคอลเล็กชัน และอื่นๆ
Coroutine เชื่อมโยงกับโฟลว์อย่างใกล้ชิด และให้วิธีการเขียนโค้ดแบบแอซิงโครนัสที่ยอดเยี่ยม ซึ่งช่วยให้นักพัฒนาแอปไม่ต้องเขียนรูทีนการเรียกคืนอย่างชัดเจน ฟิวล์ทำงานร่วมกับโคโริวทีน ซึ่งใช้เป็นวิธีดึงข้อมูลจากโคโริวทีนแบบไม่พร้อมกันโดยไม่ต้องรอให้ฟังก์ชันหรือเธรดทำงานเสร็จ
ผู้บริโภคจะดึงข้อมูลจากโฟลว์ในกระบวนการที่เรียกว่าการเก็บรวบรวม
ฟลายท์ Kotlin มีฟังก์ชัน collect()
ที่อาจใช้เพื่อวัตถุประสงค์นี้ได้ สิ่งที่เกิดขึ้นในขั้นตอนระหว่างการเก็บรวบรวมจะขึ้นอยู่กับประเภทของขั้นตอน
ขั้นตอน Kotlin (Flow<T>
) เป็นแบบเย็นโดยค่าเริ่มต้น ซึ่งหมายความว่าโค้ดเครื่องมือสร้างขั้นตอนจะสร้างข้อมูลก็ต่อเมื่อมีการเรียกใช้ collect()
ในทางตรงกันข้าม ฟีดข้อมูลร้อนจะสร้างข้อมูลทันที โดยจัดเก็บข้อมูลไว้ในหน่วยความจําเหมือนคิวสําหรับเวลาที่ระบบใช้ข้อมูล เนื่องจากโฟลว์ที่ใช้งานอยู่จะเก็บข้อมูลไว้ในหน่วยความจํา ระบบจึงถือว่าโฟลว์ดังกล่าวมีสถานะ
คุณอาจแปลงโฟลว์จากแบบเย็นเป็นแบบร้อนได้โดยใช้โอเปอเรเตอร์ shareIn
(ดูการเปลี่ยนโฟลว์แบบเย็นเป็นโฟลว์แบบร้อนโดยใช้ shareIn
) นอกจากนี้ คุณยังใช้ SharedFlow
หรือ StateFlow
เพื่อเปลี่ยนโฟลว์แบบเย็นเป็นโฟลว์แบบร้อนได้ด้วย
วิธีที่แอปตัวอย่างใช้โฟลว์
แอปตัวอย่างใช้โมเดลมุมมองใน Jetpack Compose ที่เชื่อมต่อกับขั้นตอนใน Home API องค์ประกอบ UI ของแอปตัวอย่างจำนวนมากจะทำงานตามสถานะ แต่โต้ตอบได้ แอปตัวอย่างยังผสมสถานะจากอุปกรณ์เข้ากับสถานะ "ในแง่ดี" ใน UI เพื่อให้ผู้ใช้ได้รับประสบการณ์การใช้งานแบบเรียลไทม์ คําว่า "มองโลกในแง่ดี" หมายความว่าแอปจะถือว่าการดําเนินการหนึ่งๆ สําเร็จและอัปเดต UI ให้แสดงผลลัพธ์ที่คาดหวังโดยทันทีโดยไม่ต้องรอการยืนยัน หากพบว่าการดำเนินการไม่สำเร็จ ระบบจะอัปเดต UI ให้แสดงสถานะจริง
ในแอปตัวอย่าง ระบบจะสร้างโฟลว์สําหรับแต่ละเลเยอร์ของโมเดลมุมมอง (โครงสร้าง ห้อง อุปกรณ์) ตัวอย่างเช่น การดำเนินการนี้จะดำเนินการกับโครงสร้างที่มีคำเรียกต่อไปนี้ใน GlobalViewModel.kt
fun getStructuresState(): StateFlow<List<StructureModel>?> =
homeClient
.structures()
.map { structures -> structures.map { StructureModel(it.name, it) }.sortedBy { it.name } }
.handleErrors()
.flowOn(Dispatchers.IO)
.stateIn(scope = viewModelScope, started = SharingStarted.WhileSubscribed(), null)
emitAll()
จะรวบรวมค่าทั้งหมดจากโฟลว์ที่ระบุและส่งไปยังตัวรวบรวม stateIn()
จะแชร์ค่าที่ส่งออกล่าสุดจากอินสแตนซ์เดียวที่ทํางานอยู่ของโฟลว์ต้นทางกับผู้สมัครใช้บริการปลายทางหลายราย ดูข้อมูลเพิ่มเติมได้ที่ข้อมูลอ้างอิง kotlinx.coroutines.flow
Jetpack Compose
หากต้องการจัดเก็บออบเจ็กต์การไหลในหน่วยความจำในเครื่องและป้องกันไม่ให้สิ้นสุดการทำงาน ให้ใช้ Kotlin
remember
API
ใน Jetpack Compose หากคุณใช้สิ่งนี้กับ collectAsStateWithLifecycle()
ทาง Jetpack จะจัดการการสมัครรับและการยกเลิกการสมัครรับจากโฟลว์โดยอัตโนมัติ โดยอิงตามว่า UI ของแอปพลิเคชันที่แสดงสถานะนั้นอยู่เบื้องหน้าหรือไม่
การเรียกใช้ง่ายๆ ในแอปตัวอย่างจะทําเช่นนี้ การใช้ฟังก์ชัน getStructuresState()
ที่แสดงก่อนหน้านี้
val structuresList by
remember(globalViewModel) { globalViewModel.getStructuresState() }.collectAsStateWithLifecycle()
ตอนนี้เมื่อสถานะของโครงสร้างมีการเปลี่ยนแปลง (เช่น name
) ฟังก์ชัน Composable ที่ใช้โครงสร้างดังกล่าวจะแสดงสถานะที่อัปเดตโดยอัตโนมัติ
ในแอปตัวอย่าง ฟังก์ชันนี้คือ HomeActivityContent()
แหล่งข้อมูล
ดูข้อมูลเพิ่มเติมเกี่ยวกับ Kotlin, Flow, Coroutine และ Jetpack Compose ได้ที่แหล่งข้อมูลต่อไปนี้
- พัฒนาแอป Android ด้วย Kotlin
- เรียนรู้ Kotlin สําหรับ Android
- โคโรทีน Kotlin ใน Android โค้ดแล็บต่อไปนี้อาจมีประโยชน์
- Kotlin Flow ใน Android และโดยเฉพาะอย่างยิ่ง StateFlow
- สถานะและ Jetpack Compose โดยเฉพาะฟังก์ชัน
collectAsStateWithLifecycle()
ฟังก์ชันนี้จะจัดการการสมัครและยกเลิกการสมัครรับข้อมูลจากโฟลว์โดยอัตโนมัติ โดยขึ้นอยู่กับว่า UI ที่แสดงสถานะนั้นอยู่เบื้องหน้าจริงหรือไม่ - หากคุณทํางานกับ Automation API การอ่านเกี่ยวกับตัวสร้างที่ปลอดภัยต่อประเภทของ Kotlin จะมีประโยชน์ในการทําความเข้าใจวิธีการทํางานของ Automation DSL