在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

了解此API、以生命周期感知方式收集數據流的理由

谷歌開發者 ? 來源:谷歌開發者 ? 作者:谷歌開發者 ? 2022-09-23 10:46 ? 次閱讀

我們推薦以生命周期感知方式在 Android 上收集數據流。如果您正在用 Jetpack Compose 構建 Android 應用,請使用 collectAsStateWithLifecycle API 以生命周期感知方式從用戶界面收集數據流。

  • 使用界面狀態
    https://developer.android.google.cn/topic/architecture/ui-layer#consume-ui-state

借助 collectAsStateWithLifecycle,您可以在不需要應用資源時釋放它們,例如當應用處于后臺時。此類資源可能包括 Firebase 查詢、位置或網絡更新及數據庫連接等,在不需要它們的情況下讓其處于活躍狀態會影響用戶設備的運行健康狀況。 請繼續閱讀本文,以詳細了解此 API、以生命周期感知方式收集數據流的理由,以及此 API 與 collectAsState API 的差異。

collectAsStateWithLifecycle

collectAsStateWithLifecycle 是一個可組合函數,可從數據流中收集值,并以生命周期感知方式將最新值表示為 Compose State。每當數據流發出新值時,此 State 對象的值都會更新,從而讓組合 (Composition) 中每個使用 State.value 的對象進行重新組合。

  • State
    https://developer.android.google.cn/reference/kotlin/androidx/compose/runtime/State

默認情況下,collectAsStateWithLifecycle 使用 Lifecycle.State.STARTED 從數據流中開始和結束收集值。這些動作會在生命周期 (Lifecycle) 移入和移出目標狀態時發生。您可以通過 minActiveState 參數配置此生命周期狀態。

cce1b05a-3ae0-11ed-9e49-dac502259ad0.png

△ 默認情況下,當應用處于后臺時 collectAsStateWithLifecycle 會取消收集數據流

  • Lifecycle.State.STARTED
    https://developer.android.google.cn/reference/android/arch/lifecycle/Lifecycle.State#started

以下代碼片段展示了如何使用 collectAsStateWithLifecycle 來收集可組合函數中的 ViewModel 所公開的 StateFlow 的 uiState 字段:


/* Copyright 2022 Google LLC.     SPDX-License-Identifier: Apache-2.0 */
@OptIn(ExperimentalLifecycleComposeApi::class)@Composablefun AuthorRoute(  onBackClick: () -> Unit,  modifier: Modifier = Modifier,  viewModel: AuthorViewModel = hiltViewModel()) {  val uiState: AuthorScreenUiState by viewModel.uiState.collectAsStateWithLifecycle()
  AuthorScreen(    authorState = uiState.authorState,    newsState = uiState.newsState,    modifier = modifier,    onBackClick = onBackClick,    onFollowClick = viewModel::followAuthorToggle,  )}

每當 AuthorViewModeluiState 發出新的 AuthorScreenUiState 值時,都會重新組合 AuthorRoute。有關 collectAsStateWithLifecycle 的更多用法,請參考 "Now in Android" 應用及相關遷移 PR

  • AuthorViewModel
    https://github.com/android/nowinandroid/blob/main/feature-author/src/main/java/com/google/samples/apps/nowinandroid/feature/author/AuthorViewModel.kt
  • AuthorRoute
    https://github.com/android/nowinandroid/blob/main/feature-author/src/main/java/com/google/samples/apps/nowinandroid/feature/author/AuthorScreen.kt
  • Now in Android
    https://github.com/android/nowinandroid/search?q=collectAsStateWithLifecycle
  • 遷移 PR
    https://github.com/android/nowinandroid/pull/166

如果您要在項目中使用 collectAsStateWithLifecycle API,請將 androidx.lifecycle.lifecycle-runtime-compose 工件添加到項目中。


/* Copyright 2022 Google LLC.     SPDX-License-Identifier: Apache-2.0 */
// app/build.gradle filedependencies {    implementation "androidx.lifecycle2.6.0-alpha01"}

注意: 這是一個尚處于 Alpha 版的全新 API,且該 API 還要求您使用ExperimentalLifecycleComposeApi 注釋。

  • 版本 2.6.0-alpha01
    https://developer.android.google.cn/jetpack/androidx/releases/lifecycle#version_26_2

  • ExperimentalLifecycleComposeApi
    https://developer.android.google.cn/reference/kotlin/androidx/lifecycle/compose/ExperimentalLifecycleComposeApi

工作原理

collectAsStateWithLifecycle 在實現機制上使用了 repeatOnLifecycle API,我們也推薦大家在 Android 視圖 (View) 系統中收集數據流的 API。

  • collectAsStateWithLifecycle 的實現機制
    https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:lifecycle/lifecycle-runtime-compose/src/main/java/androidx/lifecycle/compose/FlowExt.kt;l=168

  • repeatOnLifecycle
    https://developer.android.google.cn/reference/kotlin/androidx/lifecycle/package-summary#(androidx.lifecycle.Lifecycle).repeatOnLifecycle(androidx.lifecycle.Lifecycle.State,kotlin.coroutines.SuspendFunction1)

借助 collectAsStateWithLifecycle,您無需輸入下方的樣板代碼,這些代碼同樣以生命周期感知的方式從可組合函數收集數據流:


/*Copyright2022GoogleLLC.   SPDX-License-Identifier: Apache-2.0 */@ComposablefunAuthorRoute(...){vallifecycle=LocalLifecycleOwner.current.lifecyclevaluiStatebyproduceState(initialValue=viewModel.uiState.valuekey1=lifecyclekey2=viewModel){lifecycle.repeatOnLifecycle(state=STARTED){viewModel.uiState.collect{value=it}}}
AuthorScreen(...)}

在架構中收集數據流

應用架構中的類型不應該知道其他類型的實現細節。界面不應該知道 ViewModel 如何產生界面狀態。如果界面在屏幕上不可見,則應停止收集數據流,以釋放應用資源 (如果可行的話)。

界面可以通過使用 collectAsStateWithLifecycle 收集界面狀態來幫助釋放資源。ViewModel 可以通過以收集器感知的方式生成界面狀態來完成相同的操作。如果沒有收集器,例如當界面在屏幕上不可見時,則停止收集來自數據層的上游數據流。您可以在生成界面狀態時使用 .stateIn(WhileSubscribed) 數據流 API 來執行此操作。如需了解更多信息,請觀看 "Kotlin Flows 實戰" 講座的這一部分。如要測試以這種方法生成界面狀態的 ViewModel,請查看測試指南

cd05bbf8-3ae0-11ed-9e49-dac502259ad0.png

△ 在界面層中,使用 collectAsStateWithLifecycle 收集界面狀態,并在數據層公開響應式數據流時使用 .stateIn(WhileSubscribed) 生成界面狀態。這樣一來應用的其余部分便能在不需要的時候釋放資源

  • .stateIn(WhileSubscribed)
    https://github.com/android/nowinandroid/blob/main/feature-author/src/main/java/com/google/samples/apps/nowinandroid/feature/author/AuthorViewModel.kt#L104

  • Kotlin Flows 實戰
    https://www.youtube.com/watch?v=fSB6_KE95bU&t=1009s

  • 測試 StateFlow
    https://developer.android.google.cn/kotlin/flow/test#statein

數據流的使用者和生產者不需要知道彼此的實現方式。在具備多個環境、變體、代碼庫和功能的大型應用中找出實現細節是非常耗時的。更糟糕的是,依賴于實現細節的代碼維護起來非常困難。

讓資源在后臺保持活躍狀態

Android 應用可以在海量 Android 設備上運行。但遺憾的是,所有設備和用戶擁有的資源都是有限的,因此應用通常在受限環境中運行。運行 Android 應用時,有一些重要因素會影響用戶體驗和設備系統健康:
  • CPU 使用: 在所有設備組件中,CPU 的耗電量最高。而電池續航時間一直是用戶關注的重點,因此如果發生 CPU 濫用的情況,用戶可能會卸載您的應用;

  • 流量消耗: 在未連接 Wi-Fi 時減少應用的網絡流量,可以幫助用戶節省流量費用;

  • 內存用量: 應用對內存的使用方式也會對設備的整體穩定性和性能產生非常大的影響。

如果 Android 開發者想滿足用戶的需求、確保設備系統健康,或 "為數十億用戶打造產品",則應該根據其目標市場、設備或國家/地區的實際情況來優化上述這些因素。根據設備類型和設備上 Android 版本的不同,讓不必要的資源保持活躍可能會產生負面影響。在界面層中使用 collectAsStateWithLifecycle 可以讓層次結構的其余部分得以釋放資源。
  • 為數十億用戶打造產品
    https://developer.android.google.cn/docs/quality-guidelines/build-for-billions

與 collectAsState 的差異

開發者們經常會問道: 如果 collectAsStateWithLifecycle 是從 Android 可組合函數中收集數據流最安全的方法,那現在為什么還需要 collectAsState API?為什么不將生命周期感知功能添加到 collectAsState 中,而是創建新的 API?

可組合函數的生命周期與 Compose 運行的平臺無關。正如 "可組合項的生命周期" 頁面中所述,可組合函數的實例進入組合,執行 0 次或多次重組,然后離開組合:

https://developer.android.google.cn/jetpack/compose/lifecycle

cd2510ac-3ae0-11ed-9e49-dac502259ad0.png

△ 組合中可組合函數實例的生命周期

collectAsState API 遵循組合的生命周期。此 API 在可組合項進入組合時開始收集數據流,并在可組合項離開組合時停止收集。collectAsState 是用于收集數據流且與平臺無關的 API。

但是,在 Android 應用中使用 Compose 時,Android 生命周期也會對資源的管理方式產生非常大的影響。即使 Compose 在 Android 應用處于后臺時停止重組,collectAsState 也會繼續收集數據流。這使得層次結構的其余部分無法釋放資源。

collectAsStatecollectAsStateWithLifecycle 在 Compose 中各有用途。后者用于開發 Android 應用,前者用于在其他平臺進行開發。

collectAsState 遷移到 collectAsStateWithLifecycle 非常容易:


/* Copyright 2022 Google LLC.     SPDX-License-Identifier: Apache-2.0 */
@Composablefun AuthorRoute(...) {    val lifecycle = LocalLifecycleOwner.current.lifecycle    val uiState by produceState(        initialValue = viewModel.uiState.value        key1 = lifecycle        key2 = viewModel    ) {        lifecycle.repeatOnLifecycle(state = STARTED) {            viewModel.uiState.collect { value = it }        }    }
    AuthorScreen(...)}

推薦大家以生命周期感知方式在 Android 上收集數據流,這樣做可以使應用的其他部分在需要時釋放資源。 如果您正在使用 Jetpack Compose 構建 Android 應用,請使用 collectAsStateWithLifecycle 可組合函數來執行此操作。 另外: 感謝 Jose AlcérrecaMarton BraunAlejandra Stamato 和 Jake Roseman 對文章內容進行審核。

  • Jose Alcérreca
    https://medium.com/u/e0a4c9469bb5

  • Marton Braun
    https://medium.com/u/ec2087b3c81f

  • Alejandra Stamato
    https://medium.com/u/92c44d274e60

審核編輯 :李倩

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Android
    +關注

    關注

    12

    文章

    3959

    瀏覽量

    129170
  • API
    API
    +關注

    關注

    2

    文章

    1553

    瀏覽量

    63254
  • 數據流
    +關注

    關注

    0

    文章

    122

    瀏覽量

    14629

原文標題:在 Jetpack Compose 中安全地使用數據流

文章出處:【微信號:Google_Developers,微信公眾號:谷歌開發者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    KaihongOS操作系統:頁面的生命周期介紹

    頁面的生命周期 在KaihongOS中,學習頁面的生命周期前需要先了解自定義組件。 1. 自定義組件(Component) 自定義組件是通過@Component裝飾的UI單元,可以組合多個系統
    發表于 04-25 08:18

    KaihongOS操作系統:UIAbility的生命周期

    狀態。系統會調用回調,開發者可以在這里執行清理操作,比如停止后臺任務、釋放資源等。 這些狀態和回調方法為開發者提供了UIAbility生命周期的監控能力,使得開發者可以根據UIAbility的不同狀態
    發表于 04-25 07:04

    設備全生命周期數字孿生:從采購到報廢的智能決策閉環

    數字孿生技術為企業打造設備全生命周期數據驅動的智能閉環”,大幅提升設備選型、運維、報廢決策效率,縮短安裝周期。通過全息感知、模擬推演和決策優化,實現設備從“經驗運維”到“算法驅動”的
    的頭像 發表于 03-28 10:23 ?210次閱讀
    設備全<b class='flag-5'>生命周期</b>數字孿生:從采購到報廢的智能決策閉環

    一文讀懂產品生命周期管理系統(PLM)?

    在當今快速迭代的制造業和科技領域,企業能否高效管理產品從概念到退市的全生命周期,已成為其核心競爭力的重要體現。產品生命周期管理系統(Product Lifecycle Management, PLM
    的頭像 發表于 03-10 17:09 ?351次閱讀
    一文讀懂產品<b class='flag-5'>生命周期</b>管理系統(PLM)?

    醫療設備全生命周期管理,守護健康生命

    醫療設備全生命周期管理是保障醫療服務的關鍵,其中物聯網技術實現設備實時監測,大數據分析助力精準維護決策,為設備健康管理帶來了革命性變化。
    的頭像 發表于 03-03 10:30 ?212次閱讀
    醫療設備全<b class='flag-5'>生命周期</b>管理,守護健康<b class='flag-5'>生命</b>線

    PLM產品生命周期管理系統需要采集哪些數據

    理念和技術手段,通過集成和管理產品相關的所有信息,包括設計數據、工藝流程、質量控制、供應鏈信息等,實現對產品全生命周期的有效管理。 其中,數據采集的PLM系統的根基。比如在生產制造環節,通過采集生產過程中的質量
    的頭像 發表于 02-24 17:13 ?277次閱讀
    PLM產品<b class='flag-5'>生命周期</b>管理系統需要采集哪些<b class='flag-5'>數據</b>

    PLM解決方案,產品生命周期管理軟件

    PLM解決方案產品生命周期管理軟件規劃、開發和交付超越客戶期望的創新產品。借助我們適用于任意規模的可擴展、適應性強的PLM解決方案,利用準確的產品數據推動多學科團隊之間的協作。優化產品生命周期客戶
    的頭像 發表于 02-10 10:15 ?312次閱讀
    PLM解決方案,產品<b class='flag-5'>生命周期</b>管理軟件

    什么是PLM產品生命周期管理系統?

    在當今競爭激烈的制造業環境中,企業不僅要關注產品的設計和生產,還需要對產品的整個生命周期進行全面管理。這包括了從產品概念構思、設計開發、生產制造、銷售分發,到最終報廢處理的每一個環節。為了高效、系統
    的頭像 發表于 11-23 16:14 ?763次閱讀
    什么是PLM產品<b class='flag-5'>生命周期</b>管理系統?

    鴻蒙開發組件:DataAbility的生命周期

    應用開發者可以根據業務場景實現data.js/data.ets中的生命周期相關接口。DataAbility生命周期接口說明見下表。
    的頭像 發表于 06-20 09:39 ?595次閱讀

    鴻蒙開發:【PageAbility的生命周期

    PageAbility生命周期是PageAbility被調度到INACTIVE、ACTIVE、BACKGROUND等各個狀態的統稱。PageAbility生命周期流轉及狀態說明見如下圖1、表1所示。
    的頭像 發表于 06-17 10:05 ?865次閱讀
    鴻蒙開發:【PageAbility的<b class='flag-5'>生命周期</b>】

    鴻蒙Ability Kit(程序框架服務)【UIAbility組件生命周期】實例

    本文檔主要描述了應用運行過程中UIAbility和自定義組件的生命周期。對于UIAbility,描述了Create、Foreground、Background、Destroy四種生命周期。對于頁面
    的頭像 發表于 05-31 15:03 ?1387次閱讀
    鴻蒙Ability Kit(程序框架服務)【UIAbility組件<b class='flag-5'>生命周期</b>】實例

    如何保護電子元器件延長生命周期

    元器件延長生命周期,解決這個問題的一種方法是在生產結束后長期儲存半導體元件。該解決方案使您能夠在設備的整個使用壽命期間持續供應組件。01電子設備如果沒有組成它們的
    的頭像 發表于 05-31 13:59 ?845次閱讀
    如何保護電子元器件<b class='flag-5'>以</b>延長<b class='flag-5'>生命周期</b>

    Traveo II B-H中的SECURE和SECURE_WITH_DEBUG生命周期階段有何不同?

    Traveo II B-H 中的 SECURE 和 SECURE_WITH_DEBUG 生命周期階段有何不同?
    發表于 05-21 07:07

    HarmonyOS開發案例:【UIAbility和自定義組件生命周期

    本文檔主要描述了應用運行過程中UIAbility和自定義組件的生命周期。對于UIAbility,描述了Create、Foreground、Background、Destroy四種生命周期。對于頁面
    的頭像 發表于 05-10 15:31 ?1692次閱讀
    HarmonyOS開發案例:【UIAbility和自定義組件<b class='flag-5'>生命周期</b>】

    IBM推出IBM Storage Assurance這一全新的IT生命周期管理模式

    近日,IBM 推出了 IBM Storage Assurance 這一全新的 IT 生命周期管理模式,旨在為客戶的數據中心提供靈活的選擇與控制,最大程度提高性能。
    的頭像 發表于 05-08 14:09 ?624次閱讀
    主站蜘蛛池模板: 曰本福利写真片视频在线 | 最新毛片网 | 97人摸人人澡人人人超一碰 | 天天射日 | 免费四虎永久在线精品 | 干干操| 午夜私人影院 | 亚洲 欧美 自拍 卡通 综合 | 综合色吧 | 亚洲天堂资源 | www.五月激情| 一级国产特黄aa大片 | 97精品在线 | 好大好猛好爽好深视频免费 | 亚洲欧美日韩在线观看你懂的 | aaa在线观看视频高清视频 | 色婷婷狠狠久久综合五月 | 国产理论视频在线观看 | 午夜情趣视频 | 日本特黄在线观看免费 | 1024人成网站色 | 国产一级一级片 | 一级做a爰片久久毛片一 | 亚洲一区日韩一区欧美一区a | 一区二区中文字幕在线观看 | tube日本xxxx69 | 流不尽奶水的大乳h | 黄色大成网站 | 午夜男人视频 | 精品乱码一区二区三区四区 | 四虎影院视频 | 亚洲第一精品夜夜躁人人爽 | 亚洲天堂ww | 日韩在线看片 | 一区二区三区亚洲视频 | 天天做天天爱天天综合网2021 | 5566成人免费视频观看 | 天天做天天爰夜夜爽 | 精品一区视频 | 五月激情丁香网 | 久久伊人操 |