# Introduction ## 導言概述: - 這段影片旨在提供 Android 開發中不同可觀察物件(observables)的概觀,包括 LiveData、StateFlow、Normal Flow、SharedFlow 和 Compose State。 - 這些可觀察物件相似,但在細微方面有所不同,影片旨在澄清這些差異。 - 目標是指導觀眾如何在其項目中使用這些可觀察物件,以及在不同情況下選擇特定可觀察物件的時機。 - 創建了一個演示應用程序來展示 LiveData、StateFlow、Normal Flow 和 SharedFlow 之間的區別。 - 在應用程序中演示了 LiveData、StateFlow 和 Normal Flow,而 Compose State 則提到但未使用,因為該項目是在 XML 中。 ## 演示應用程序設置: - 應用程序包含 LiveData、StateFlow、Normal Flow 和 SharedFlow 的按鈕。 - 點擊這些按鈕會觸發對 ViewModel 的調用,進而修改相應的可觀察物件,導致顯示文本的變化。 ## 目的: - 影片的目的是為了闡明這些可觀察物件的使用方式,確保觀眾了解在其項目中何時使用每個可觀察物件。 - 主持人強調觀看影片至結尾將解答可能的問題,並提供對該主題的全面理解。 ## 備註: - Compose State 提到但未在當前的 XML 項目中演示,建議在 Compose 項目中演示。 # LiveData ## LiveData 章節概述: - 在這一部分,作者逐步展示了如何觀察數據值以及創建可觀察物件。 - 開始使用 LiveData,這是列表中最為人熟知的可觀察模式之一,屬於 Android Jetpack 組件的一部分。 - LiveData 是一個狀態保持器,用於保持 UI 狀態。它是最古老的可觀察模式,也是僅適用於 Java 項目的模式。 ## LiveData 的功能與特性: - LiveData 是一個狀態保持器,用於保存 UI 狀態的變化。當 UI 中的值隨時間變化時,這些變化需要被儲存下來,以免在屏幕旋轉等情況下丟失。 - 它自動通知所有觀察者當前值的變化,這樣在活動(Activity)旋轉時,觀察者可以得到及時更新。 ## 觀察 LiveData: - 作者示範了如何在 MainActivity 中觀察 LiveData。觀察 LiveData 需要注意生命週期感知,它只有在對應的生命週期處於適當狀態時才會觸發新值或當前值的通知。 ## Demo 演示: - 通過點擊 LiveData 按鈕,觸發 ViewModel 中的事件,將新值賦予 LiveData。這將觸發 LiveData 觀察者的更新,從而改變 UI 上的文字顯示。 - 作者強調了 LiveData 的一個重要特性:當設備旋轉時,LiveData 會自動觸發,保持值的不變性,使得 UI 文本不會重置為初始值。 # StateFlow ## StateFlow 章節概述: - 在這一部分,作者介紹了 StateFlow,並將其與 LiveData 進行了比較。 - StateFlow 也是一個狀態保持器類,與 LiveData 相似,但有些微不同。 - StateFlow 是一個流(Flow),而 LiveData 僅是一個狀態保持器,並且 StateFlow 可以做更多的事情。 ## StateFlow 的特點與功能: - StateFlow 是一個狀態保持器,同樣用於保存 UI 狀態。與 LiveData 不同,StateFlow 是一個流,基於 Kotlin 的 Flow 框架。 - 作者強調 StateFlow 與 LiveData 非常相似,因為它們都用於存儲狀態,但 StateFlow 有更多的流特性,後續會詳細介紹。 ## 觀察 StateFlow: - 為了觀察 StateFlow 的值,需要在 Kotlin 的 Coroutine 框架中啟動一個 Coroutine 來收集(collect)StateFlow 的最新值。 - 作者提醒了使用 `lifecycleScope.launchWhenStarted` 來收集 StateFlow,這樣可以確保在適當的生命週期狀態下進行收集,以避免不必要的資源浪費。 ## 推薦使用 StateFlow: - 作者個人建議不再使用 LiveData,而是選擇 StateFlow,因為 StateFlow 在功能上更強大,且更容易測試。 - StateFlow 可以利用 Kotlin 協程的強大功能,進行輕鬆的測試,並且有豐富的流操作符可供使用,如映射(map)、篩選(filter)等。 # Flow ## 普通 Flow 概述: - 這部分介紹了普通的 Flow,與 StateFlow 和 LiveData 不同,普通的 Flow 不像狀態保持器那樣持有值,而是執行一系列操作並發出值。 - 在 ViewModel 中,沒有像狀態流那樣的變量,而是一個名為 triggerFlow 的函數,該函數返回一個 Flow。這是普通 Flow 的工作方式。 ## 普通 Flow 的功能與特性: - 普通 Flow 使用 flow 建構器來構建流,其中可以執行暫停函數。使用 emit 函數可以發出值,通知觀察者。 - 與 StateFlow 不同,普通 Flow 不持有值,而是在執行操作的同時,可以在一段時間內發出不同的值。 - 在這個示例中,流重複執行一個區塊五次,每次發出一個字符串並延遲一秒,總共發出五次值。 ## 觀察普通 Flow: - 與觀察狀態流類似,可以使用 collectLatest 函數訂閱普通的 Flow,並在收集器中執行相應的操作。 - 建議在 lifecycleScope 中使用 launch 啟動 Coroutine 來收集 Flow 的值。 ## Demo 演示: - 點擊按鈕觸發普通的 Flow,它將執行並發出值。每次點擊將創建一個新的流並發出值,但在活動重新創建時,與 LiveData 和 StateFlow 不同,普通 Flow 不會保持其狀態。 # SharedFlow ## SharedFlow 章節概述: - 在這一部分,作者介紹了 SharedFlow,它是一種不同於其他觀察器的流,用於處理一次性事件的發送。 - SharedFlow 與 StateFlow 和 LiveData 不同,它更適合用於發送一次性事件,例如顯示 Toast 或 Snackbar 等。 - SharedFlow 與 StateFlow 一樣都是熱流,即使沒有收集器訂閱,它們也會發送事件。 ## SharedFlow 的特點與功能: - SharedFlow 不保持值,它是一種熱流,用於發送一次性事件,並不會在屏幕旋轉等情況下重新發送相同的事件。 - SharedFlow 可以在 ViewModel 中觸發事件,並且在 UI 中接收和處理這些事件。 ## SharedFlow 的使用場景: - SharedFlow 適用於需要發送一次性事件的情況,例如在 ViewModel 中處理 API 錯誤並顯示 Snackbar。 - SharedFlow 可以用於在不同部分之間傳遞事件,例如從 ViewModel 到 UI,以觸發導航或顯示消息等操作。 ## SharedFlow vs StateFlow: - SharedFlow 和 StateFlow 都是熱流,但它們的主要區別在於它們的使用場景和行為。SharedFlow 主要用於發送一次性事件,而 StateFlow 用於保持持續更新的狀態。 # Compose state ## Compose State 章節概述: - 這一部分講解了 Compose state,它在顯示 UI 中的狀態方面有所不同,但仍然是一個狀態保持器。 - 在 Jetpack Compose 中,使用 Compose state 是必要的,因為 Compose 框架的工作方式是當 Compose state 發生變化時,受影響的元素將重新繪製以反映新的狀態。 ## Compose State 的特點與使用情況: - Compose state 是 Jetpack Compose 框架中的一個重要概念,它負責保存 UI 的狀態。 - 使用 Compose state 能夠讓 Compose 框架自動處理 UI 的重新繪製,從而反映最新的狀態變化。 ## 在 Jetpack Compose 中的使用建議: - 在使用 Jetpack Compose 時,建議使用 Compose state 來管理 UI 的狀態。 - 如果使用 XML 布局,則建議使用其他觀察器,如 StateFlow 和 SharedFlow,以及普通 Flow。 # 差異 以下是包括使用時機的對比表格,列出了 LiveData、StateFlow、Flow、SharedFlow 和 Compose state 的差異: | 特性 | LiveData | StateFlow | Flow | SharedFlow | Compose state | |----------------|----------------------------------------|-----------------------------------|---------------------------------|----------------------------------------|----------------------------------------| | 生命週期感知 | 是 | 否 | 否 | 否 | 否 | | 非同步支持 | 是 | 是 | 是 | 是 | 否 | | 支持多值發射 | 否 | 否 | 是 | 是 | 否 | | 適用於 Kotlin 協程 | 否 | 是 | 是 | 是 | 否 | | 整合性 | 與 Android 架構組件整合 | Kotlin 協程整合 | Kotlin 協程整合 | - | Jetpack Compose 整合 | | 用途 | 管理 Android UI 相關狀態 | 管理單一值狀態 | 處理異步操作和數據流 | 共享的多觀察者情境 | 管理 Jetpack Compose UI 相關狀態 | | 使用時機 | 用於管理 Android UI 相關狀態,特別是與 ViewModel 搭配使用。 | 用於管理應用程式的業務邏輯中的單一值狀態,例如 ViewModel 中的狀態管理。 | 用於處理通用的非同步操作和數據流。 | 用於創建共享的多觀察者訂閱的事件流。 | 用於管理 Jetpack Compose 應用程式中的 UI 相關狀態。 | --- | 特點 | LiveData | StateFlow | Flow | SharedFlow | Compose state | |--------------|--------------|--------------|--------------|--------------|---------------| | 類型 | Android Jetpack 中的元件,僅適用於 Java 專案 | Kotlin 的 Flow API 中的一部分,Kotlin 特有 | Kotlin 的 Flow API 中的一部分,Kotlin 特有 | Kotlin 的 Flow API 中的一部分,Kotlin 特有 | Jetpack Compose 中的元件,僅適用於 Compose 專案 | | 資料持有 | 是 | 是 | 否 | 否 | 是 | | 資料傳遞方式 | 即時通知,觀察者收到資料變化通知 | 即時通知,觀察者收到資料變化通知 | 主動收集資料,需呼叫 `collect` | 主動收集資料,需呼叫 `collect` | 當狀態改變時,Compose 元件自動重新繪製 | | 資料更新 | 單向更新,資料修改後會通知觀察者 | 單向更新,資料修改後會通知觀察者 | 資料源頭主動發出更新通知 | 資料源頭主動發出更新通知 | 元件狀態改變時自動重新繪製 | | 資料生命週期 | 與生命週期相關聯,避免內存洩漏 | 與生命週期相關聯,避免內存洩漏 | 與生命週期相關聯,避免內存洩漏 | 與生命週期無關聯 | 與 Compose 元件生命週期相關聯 | | 適用情境 | 舊的 Android 專案或 Java 項目 | Kotlin 專案,需要觀察資料變化 | 需要在一段時間內持續收集資料 | 發送一次性事件或通知 | Jetpack Compose 專案,需要即時更新介面 | 這個表格可以幫助您更好地了解每種狀態管理工具的特性以及在何種情況下使用它們是最合適的。 # 關鍵字 - 可觀察物件:在 Android 開發中,可觀察物件是允許 UI 元件對底層數據的變化做出反應的組件。常見的可觀察物件包括 LiveData、StateFlow、Normal Flow、SharedFlow 和 Compose State。 - LiveData:是一個生命周期感知的可觀察數據持有類。它是 Android 架構組件的一部分,旨在與 UI 組件一起使用,以確保僅當組件處於活動狀態時才觀察到數據更新。 - StateFlow:表示具有可以被觀察的值的狀態的流。它是 Kotlin 的 Flow API 的一部分,常用於管理反應式編程中的狀態變化。 - Normal Flow:不是特定的 Android 組件,但可能是指正常使用 Kotlin Flows,它是 Kotlin 協程的一部分,用於異步和反應式編程。 - SharedFlow:Kotlin 的 Flow API 中的另一個組件,表示向所有收集器發射值的熱流。適用於需要多個代碼庫部分觀察相同數據流的情況。 - Compose State:提到但未在 XML 項目中演示,可能指的是在 Jetpack Compose 中的狀態管理,這是一個現代化的 Android UI 工具包。Compose State 專門用於 Compose 項目。 - ViewModel:在 Android 開發中,ViewModel 是一個設計用於以生命周期為中心的方式存儲和管理 UI 相關數據的類。它允許數據在配置更改(例如屏幕旋轉)時保留,並幫助將 UI 相關邏輯與 UI 組件分開。 - LiveData:LiveData 是一個狀態保持器,用於在 Android 應用程序中保存 UI 狀態的變化。它是 Android Jetpack 組件的一部分,並提供了生命週期感知的數據持有模式,使得 UI 狀態可以在活動生命週期的適當時機被觀察和更新。 - 生命周期感知(Lifecycle-aware):LiveData 和其他 Android 架構組件一樣,具有生命週期感知能力。這意味著它可以感知活動或片段的生命週期狀態,並在適當的時機觸發事件,例如當活動處於活躍狀態時更新數據。 - 觀察者(Observer):LiveData 的觀察者是用於監聽數據變化的訂閱者。當 LiveData 的值發生變化時,所有已註冊的觀察者將被通知並執行相應的操作。 - 屏幕旋轉(Screen Rotation):指移動設備屏幕方向導致活動重新創建的情況。對於 Android 應用程序來說,處理屏幕旋轉時的數據保存和恢復是一個常見的挑戰。LiveData 通過保持數據狀態,在屏幕旋轉後能夠自動觸發並保持 UI 的一致性。 - StateFlow:StateFlow 是一個用於保存 UI 狀態的狀態保持器,同時也是 Kotlin 的 Flow 框架中的一種流。它與 LiveData 相似,但功能更豐富,可以利用 Kotlin 協程的特性進行更多的操作和測試。 - Kotlin Flow:Kotlin Flow 是 Kotlin 協程提供的一個異步流框架,用於處理異步數據流。它允許以類似於同步編程的方式來處理非同步操作,並提供豐富的操作符以方便數據轉換和處理。 - Coroutine:Coroutine 是 Kotlin 提供的一種輕量級線程處理機制,用於處理非同步任務和並發編程。它允許在不同的線程間進行非阻塞式的異步操作,並提供了簡潔的語法和強大的功能。 - lifecycleScope.launchWhenStarted:一個 Coroutine 啟動器,用於在特定生命週期狀態下啟動協程。通常用於在 Activity 或 Fragment 的生命週期處於開始狀態時執行非阻塞的操作,如訂閱 StateFlow。 - 流操作符(Flow operators):用於對流進行轉換、過濾和映射等操作的功能函數。在 Kotlin Flow 中,提供了許多內置的操作符,使得對流的處理更加方便和靈活。 - StateFlow、熱流(Hot Flow):熱流是一種在沒有收集器的情況下仍然會發出值的流。即使沒有收集器訂閱,熱流仍會持續產生值。在狀態流的情況下,即使沒有觀察者註冊,它也會持續發出值。 - 冷流(Cold Flow):冷流是一種只有在有收集器訂閱時才會發出值的流。如果沒有收集器訂閱,冷流不會產生值。這與熱流相反,在沒有收集器訂閱時不會產生值。 - 普通 Flow:普通 Flow 是一種基於 Kotlin Flow 框架的流,它不像 LiveData 和 StateFlow 那樣作為狀態保持器,而是執行一系列操作並發出值。它通常用於異步操作和非阻塞編程。 - Flow 建構器(Flow builder):Flow 建構器是用於創建流的函數,它提供了一個執行暫停函數的上下文,並使用 emit 函數來發出值。 - Coroutine:Coroutine 是 Kotlin 提供的一種輕量級線程處理機制,用於處理異步任務和並發編程。在這個示例中,Coroutine 用於啟動並收集 Flow 的值。 - collectLatest 函數:collectLatest 函數用於訂閱 Flow,它將收集 Flow 發出的最新值,並執行相應的操作。它與 collect 函數不同,collect 函數會在每次值發出時都觸發操作,而 collectLatest 僅在新值發出時觸發。 - 生命周期作用域(lifecycleScope):lifecycleScope 是 Android 中的一個生命週期感知的 CoroutineScope,它可以確保協程在適當的生命週期狀態下運行,避免內存泄漏和其他問題。 - 一次性事件(One-time event):指僅發生一次且不需要持續跟踪的事件。在 Android 中,例如顯示 Snackbar 或顯示一次性提示消息。 - Snackbar:Snackbar 是一種用於顯示簡短消息或通知的 Android UI 元素,通常用於顯示一次性事件的消息,如操作成功、錯誤提示等。 - 熱流(Hot Flow):熱流是一種即使沒有收集器訂閱也會發出值的流,它會持續發送事件,無論是否有收集器訂閱。 - 一次性事件流(SharedFlow):SharedFlow 是一種流,用於發送一次性事件,它不會在屏幕旋轉等情況下重新發送相同的事件,適用於一次性事件的發送。 - 狀態流(StateFlow):StateFlow 是一種流,用於保持持續更新的狀態,它會在屏幕旋轉等情況下保持其值並重新發送相同的事件。 - Compose State:Compose state 是 Jetpack Compose 中用於管理 UI 狀態的概念,它會在狀態發生變化時觸發 UI 的重新繪製。 - Jetpack Compose:Jetpack Compose 是一個用於構建 Android UI 的現代工具包,它允許開發人員使用 Kotlin 編程語言來構建優雅且易於維護的用戶界面。 - UI 狀態管理:UI 狀態管理是指在應用程序中有效地管理和更新 UI 元素的狀態,以保證用戶界面的一致性和動態性。 - Composable:Composable 是 Jetpack Compose 中的概念,它表示一個可以自動重新繪製的 UI 元素,當與之相關聯的狀態發生變化時,Composable 將自動更新以反映最新的狀態。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up