Phiên bản Kotlin của API Home sử dụng luồng, một tính năng của ngôn ngữ Kotlin cung cấp các chức năng mạnh mẽ để xử lý luồng dữ liệu không đồng bộ, bao gồm cả việc chuyển đổi, lọc, ánh xạ, chuyển đổi sang và từ các bộ sưu tập, v.v.
Coroutine liên kết chặt chẽ với các luồng và cung cấp một phương thức trừu tượng tinh tế để viết mã không đồng bộ, đồng thời giúp nhà phát triển không phải viết rõ ràng các quy trình gọi lại. Flow hoạt động song song với coroutine, đóng vai trò là một cách để truy xuất dữ liệu từ coroutine một cách không đồng bộ mà không phải chờ hoàn tất một hàm hoặc luồng.
Người dùng truy xuất dữ liệu từ một luồng trong một quy trình được gọi là thu thập.
Luồng Kotlin có một hàm collect()
có thể được dùng cho mục đích này. Điều xảy ra trong một flow trong quá trình thu thập phụ thuộc vào loại flow.
Theo mặc định, luồng Kotlin (Flow<T>
) là lạnh, nghĩa là mã trình tạo luồng chỉ tạo dữ liệu khi collect()
được gọi. Ngược lại, luồng nóng tạo dữ liệu ngay lập tức, lưu vào bộ nhớ đệm như một hàng đợi bất cứ khi nào dữ liệu được sử dụng. Vì duy trì dữ liệu trong bộ nhớ nên luồng nóng được coi là có trạng thái.
Bạn có thể chuyển đổi flow từ lạnh sang nóng bằng cách sử dụng toán tử shareIn
(xem phần Chuyển flow lạnh sang nóng bằng shareIn
). Bạn cũng có thể sử dụng SharedFlow
hoặc StateFlow
để chuyển flow lạnh thành flow nóng.
Cách ứng dụng mẫu sử dụng luồng
Ứng dụng mẫu sử dụng các mô hình thành phần hiển thị trong Jetpack Compose được kết nối với các luồng trong API Home. Nhiều phần tử trên giao diện người dùng của ứng dụng mẫu được điều khiển bằng trạng thái, nhưng có thể tương tác. Ứng dụng mẫu cũng kết hợp trạng thái từ các thiết bị với trạng thái "tích cực" trong giao diện người dùng để mang lại trải nghiệm người dùng theo thời gian thực. Thuật ngữ lạc quan có nghĩa là ứng dụng giả định rằng một hành động nhất định đã thành công và ngay lập tức cập nhật giao diện người dùng để phản ánh kết quả dự kiến mà không cần chờ xác nhận. Nếu thao tác không thành công, giao diện người dùng sẽ được cập nhật để phản ánh trạng thái thực tế.
Trong ứng dụng mẫu, các luồng được tạo cho từng lớp của mô hình chế độ xem (cấu trúc, phòng, thiết bị). Ví dụ: lớp này thực hiện việc này cho các cấu trúc có lệnh gọi sau trong 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()
thu thập tất cả các giá trị từ flow đã cho và phát các giá trị đó đến trình thu thập. stateIn()
chia sẻ giá trị phát ra gần đây nhất từ một thực thể đang chạy duy nhất của luồng ngược dòng với nhiều người đăng ký hạ nguồn. Hãy xem tài liệu tham khảo về kotlinx.coroutines.flow
để biết thêm thông tin.
Jetpack Compose
Để lưu trữ các đối tượng flow trong bộ nhớ cục bộ và ngăn các đối tượng này bị chấm dứt, hãy sử dụng API remember
của Kotlin.
Trong Jetpack Compose, nếu bạn sử dụng tính năng này với collectAsStateWithLifecycle()
, Jetpack sẽ tự động quản lý việc đăng ký và huỷ đăng ký khỏi các luồng dựa trên việc giao diện người dùng của ứng dụng hiển thị trạng thái đó có thực sự ở nền trước hay không.
Một lệnh gọi đơn giản trong ứng dụng mẫu sẽ thực hiện việc này. Sử dụng hàm getStructuresState()
đã trình bày ở trên:
val structuresList by
remember(globalViewModel) { globalViewModel.getStructuresState() }.collectAsStateWithLifecycle()
Giờ đây, khi bất kỳ trạng thái nào của cấu trúc thay đổi (chẳng hạn như name
), hàm có khả năng kết hợp sử dụng trạng thái đó sẽ tự động phản ánh trạng thái đã cập nhật đó.
Trong ứng dụng mẫu, đây là hàm HomeActivityContent()
.
Tài nguyên
Để biết thêm thông tin về Kotlin, flow, coroutine và Jetpack Compose, hãy xem các tài nguyên sau:
- Phát triển ứng dụng Android bằng Kotlin
- Tìm hiểu về Kotlin cho Android
- Coroutine của Kotlin trên Android. Sau đây là các lớp học lập trình cụ thể có thể hữu ích:
- Flow Kotlin trên Android và cụ thể hơn là StateFlow.
- Trạng thái và Jetpack Compose, cụ thể là hàm
collectAsStateWithLifecycle()
. Hàm này tự động quản lý việc đăng ký và huỷ đăng ký khỏi các luồng dựa trên việc giao diện người dùng hiển thị trạng thái đó có thực sự ở nền trước hay không. - Nếu bạn đang làm việc với Automation API, hãy đọc về trình tạo loại an toàn Kotlin để hiểu cách hoạt động của Automation DSL.