91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

谷歌開發(fā)者 ? 來源:谷歌開發(fā)者 ? 作者:谷歌開發(fā)者 ? 2022-09-23 10:46 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

我們推薦以生命周期感知方式在 Android 上收集數(shù)據(jù)流。如果您正在用 Jetpack Compose 構(gòu)建 Android 應(yīng)用,請(qǐng)使用 collectAsStateWithLifecycle API 以生命周期感知方式從用戶界面收集數(shù)據(jù)流。

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

借助 collectAsStateWithLifecycle,您可以在不需要應(yīng)用資源時(shí)釋放它們,例如當(dāng)應(yīng)用處于后臺(tái)時(shí)。此類資源可能包括 Firebase 查詢、位置或網(wǎng)絡(luò)更新及數(shù)據(jù)庫連接等,在不需要它們的情況下讓其處于活躍狀態(tài)會(huì)影響用戶設(shè)備的運(yùn)行健康狀況。 請(qǐng)繼續(xù)閱讀本文,以詳細(xì)了解此 API、以生命周期感知方式收集數(shù)據(jù)流的理由,以及此 API 與 collectAsState API 的差異。

collectAsStateWithLifecycle

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

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

默認(rèn)情況下,collectAsStateWithLifecycle 使用 Lifecycle.State.STARTED 從數(shù)據(jù)流中開始和結(jié)束收集值。這些動(dòng)作會(huì)在生命周期 (Lifecycle) 移入和移出目標(biāo)狀態(tài)時(shí)發(fā)生。您可以通過 minActiveState 參數(shù)配置此生命周期狀態(tài)。

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

△ 默認(rèn)情況下,當(dāng)應(yīng)用處于后臺(tái)時(shí) collectAsStateWithLifecycle 會(huì)取消收集數(shù)據(jù)流

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

以下代碼片段展示了如何使用 collectAsStateWithLifecycle 來收集可組合函數(shù)中的 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,  )}

每當(dāng) AuthorViewModeluiState 發(fā)出新的 AuthorScreenUiState 值時(shí),都會(huì)重新組合 AuthorRoute。有關(guān) collectAsStateWithLifecycle 的更多用法,請(qǐng)參考 "Now in Android" 應(yīng)用及相關(guān)遷移 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

如果您要在項(xiàng)目中使用 collectAsStateWithLifecycle API,請(qǐng)將 androidx.lifecycle.lifecycle-runtime-compose 工件添加到項(xiàng)目中。


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

注意: 這是一個(gè)尚處于 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 在實(shí)現(xiàn)機(jī)制上使用了 repeatOnLifecycle API,我們也推薦大家在 Android 視圖 (View) 系統(tǒng)中收集數(shù)據(jù)流的 API。

  • collectAsStateWithLifecycle 的實(shí)現(xiàn)機(jī)制
    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,您無需輸入下方的樣板代碼,這些代碼同樣以生命周期感知的方式從可組合函數(shù)收集數(shù)據(jù)流:


/*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(...)}

在架構(gòu)中收集數(shù)據(jù)流

應(yīng)用架構(gòu)中的類型不應(yīng)該知道其他類型的實(shí)現(xiàn)細(xì)節(jié)。界面不應(yīng)該知道 ViewModel 如何產(chǎn)生界面狀態(tài)。如果界面在屏幕上不可見,則應(yīng)停止收集數(shù)據(jù)流,以釋放應(yīng)用資源 (如果可行的話)。

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

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

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

  • .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 實(shí)戰(zhàn)
    https://www.youtube.com/watch?v=fSB6_KE95bU&t=1009s

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

數(shù)據(jù)流的使用者和生產(chǎn)者不需要知道彼此的實(shí)現(xiàn)方式。在具備多個(gè)環(huán)境、變體、代碼庫和功能的大型應(yīng)用中找出實(shí)現(xiàn)細(xì)節(jié)是非常耗時(shí)的。更糟糕的是,依賴于實(shí)現(xiàn)細(xì)節(jié)的代碼維護(hù)起來非常困難。

讓資源在后臺(tái)保持活躍狀態(tài)

Android 應(yīng)用可以在海量 Android 設(shè)備上運(yùn)行。但遺憾的是,所有設(shè)備和用戶擁有的資源都是有限的,因此應(yīng)用通常在受限環(huán)境中運(yùn)行。運(yùn)行 Android 應(yīng)用時(shí),有一些重要因素會(huì)影響用戶體驗(yàn)和設(shè)備系統(tǒng)健康:
  • CPU 使用: 在所有設(shè)備組件中,CPU 的耗電量最高。而電池續(xù)航時(shí)間一直是用戶關(guān)注的重點(diǎn),因此如果發(fā)生 CPU 濫用的情況,用戶可能會(huì)卸載您的應(yīng)用;

  • 流量消耗: 在未連接 Wi-Fi 時(shí)減少應(yīng)用的網(wǎng)絡(luò)流量,可以幫助用戶節(jié)省流量費(fèi)用;

  • 內(nèi)存用量: 應(yīng)用對(duì)內(nèi)存的使用方式也會(huì)對(duì)設(shè)備的整體穩(wěn)定性和性能產(chǎn)生非常大的影響。

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

與 collectAsState 的差異

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

可組合函數(shù)的生命周期與 Compose 運(yùn)行的平臺(tái)無關(guān)。正如 "可組合項(xiàng)的生命周期" 頁面中所述,可組合函數(shù)的實(shí)例進(jìn)入組合,執(zhí)行 0 次或多次重組,然后離開組合:

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

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

△ 組合中可組合函數(shù)實(shí)例的生命周期

collectAsState API 遵循組合的生命周期。此 API 在可組合項(xiàng)進(jìn)入組合時(shí)開始收集數(shù)據(jù)流,并在可組合項(xiàng)離開組合時(shí)停止收集。collectAsState 是用于收集數(shù)據(jù)流且與平臺(tái)無關(guān)的 API。

但是,在 Android 應(yīng)用中使用 Compose 時(shí),Android 生命周期也會(huì)對(duì)資源的管理方式產(chǎn)生非常大的影響。即使 Compose 在 Android 應(yīng)用處于后臺(tái)時(shí)停止重組,collectAsState 也會(huì)繼續(xù)收集數(shù)據(jù)流。這使得層次結(jié)構(gòu)的其余部分無法釋放資源。

collectAsStatecollectAsStateWithLifecycle 在 Compose 中各有用途。后者用于開發(fā) Android 應(yīng)用,前者用于在其他平臺(tái)進(jìn)行開發(fā)。

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 上收集數(shù)據(jù)流,這樣做可以使應(yīng)用的其他部分在需要時(shí)釋放資源。 如果您正在使用 Jetpack Compose 構(gòu)建 Android 應(yīng)用,請(qǐng)使用 collectAsStateWithLifecycle 可組合函數(shù)來執(zhí)行此操作。 另外: 感謝 Jose Alcérreca、Marton Braun、Alejandra Stamato 和 Jake Roseman 對(duì)文章內(nèi)容進(jìn)行審核。

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

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

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

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Android
    +關(guān)注

    關(guān)注

    12

    文章

    4025

    瀏覽量

    133978
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    2368

    瀏覽量

    66757
  • 數(shù)據(jù)流
    +關(guān)注

    關(guān)注

    0

    文章

    129

    瀏覽量

    16192

原文標(biāo)題:在 Jetpack Compose 中安全地使用數(shù)據(jù)流

文章出處:【微信號(hào):Google_Developers,微信公眾號(hào):谷歌開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    從安裝到數(shù)據(jù):振弦式表面應(yīng)變計(jì)的全生命周期服務(wù)指南

    在工程安全監(jiān)測(cè)領(lǐng)域,振弦式表面應(yīng)變計(jì)作為一種精密的測(cè)量工具,其價(jià)值貫穿于從初始安裝到長(zhǎng)期數(shù)據(jù)服務(wù)的整個(gè)生命周期。一套科學(xué)、嚴(yán)謹(jǐn)?shù)娜?b class='flag-5'>生命周期服務(wù),是確保監(jiān)測(cè)數(shù)據(jù)準(zhǔn)確可靠、最終為結(jié)構(gòu)物安全
    的頭像 發(fā)表于 11-05 16:01 ?225次閱讀
    從安裝到<b class='flag-5'>數(shù)據(jù)</b>:振弦式表面應(yīng)變計(jì)的全<b class='flag-5'>生命周期</b>服務(wù)指南

    ALM(應(yīng)用生命周期管理)解析:一文了解其概念、關(guān)鍵階段及Perforce ALM工具推薦

    什么是ALM(應(yīng)用生命周期管理)?它遠(yuǎn)不止是SDLC!一文了解其概念、關(guān)鍵階段以及如何借助Perforce ALM這類工具,實(shí)現(xiàn)端到端的可追溯性、加速發(fā)布并保障合規(guī)性。
    的頭像 發(fā)表于 09-19 11:03 ?1840次閱讀
    ALM(應(yīng)用<b class='flag-5'>生命周期</b>管理)解析:一文<b class='flag-5'>了解</b>其概念、關(guān)鍵階段及Perforce ALM工具推薦

    如何利用技術(shù)實(shí)現(xiàn)裝置數(shù)據(jù)驗(yàn)證的全生命周期管理?

    裝置數(shù)據(jù)驗(yàn)證的全生命周期管理,需覆蓋 需求規(guī)劃、數(shù)據(jù)采集、自動(dòng)化驗(yàn)證、存儲(chǔ)歸檔、應(yīng)用迭代、退役審計(jì) 6 大核心階段。利用技術(shù)實(shí)現(xiàn)這一閉環(huán),需針對(duì)各階段的痛點(diǎn)匹配工具與方案,同時(shí)兼顧數(shù)據(jù)
    的頭像 發(fā)表于 09-05 15:23 ?746次閱讀
    如何利用技術(shù)實(shí)現(xiàn)裝置<b class='flag-5'>數(shù)據(jù)</b>驗(yàn)證的全<b class='flag-5'>生命周期</b>管理?

    【HarmonyOS 5】鴻蒙頁面和組件生命周期函數(shù)

    【HarmonyOS 5】鴻蒙頁面和組件生命周期函數(shù) ##鴻蒙開發(fā)能力 ##HarmonyOS SDK應(yīng)用服務(wù)##鴻蒙金融類應(yīng)用 (金融理財(cái)# 一、生命周期階段: 創(chuàng)建階段 build: 構(gòu)建組件
    的頭像 發(fā)表于 07-11 18:24 ?1086次閱讀

    CYW20706的生命周期狀態(tài)如何?

    CYW20706的生命周期狀態(tài)如何? 我注意到CYW20706不再列在AIROC? Bluetooth? LE& Bluetooth? 下。貿(mào)澤現(xiàn)在還將該器件列為不建議用于未來設(shè)計(jì)。 對(duì)于CYW20706來說,什么是好的更換零件。 還會(huì)有支持 LE Audio 的雙棧藍(lán)牙 SoC 嗎?
    發(fā)表于 07-04 07:25

    關(guān)于生命周期中的aboutToAppear和onPageShow的理解和應(yīng)用

    過程、應(yīng)用進(jìn)入前臺(tái)等場(chǎng)景,僅@Entry裝飾的自定義組件作為頁面時(shí)生效。 從兩者相同的角度來說,其都是在自定義組件顯示后,主動(dòng)去觸發(fā)的生命周期,在這兩個(gè)生命周期里可以寫一些數(shù)據(jù)獲取啊等相關(guān)的操作(比如
    發(fā)表于 06-30 17:32

    羅徹斯特電子應(yīng)對(duì)長(zhǎng)生命周期應(yīng)用的技術(shù)變革

    )、高帶寬內(nèi)存(HBM)以及數(shù)據(jù)中心為核心的網(wǎng)絡(luò)和存儲(chǔ)設(shè)備領(lǐng)域。盡管業(yè)界普遍積極推動(dòng)新技術(shù)的應(yīng)用,但許多長(zhǎng)生命周期的應(yīng)用并不適合。因此,在引入新技術(shù)之前,必須全面評(píng)估目標(biāo)應(yīng)用的設(shè)計(jì)周期
    的頭像 發(fā)表于 06-24 09:24 ?586次閱讀

    ArkUI-X中Plugin生命周期開發(fā)指南

    ArkUI-X插件用于拓展ArkUI應(yīng)用的能力,提供管理插件生命周期的能力。本文主要介紹Android平臺(tái)的ArkUI-X插件生命周期的使用。 Android平臺(tái)創(chuàng)建ArkUI-X插件生命周期
    發(fā)表于 06-04 22:36

    ServiceAbility的生命周期介紹

    ServiceAbility的生命周期 開發(fā)者可以根據(jù)業(yè)務(wù)場(chǎng)景重寫生命周期相關(guān)接口。ServiceAbility生命周期接口說明見下表。 表1 ServiceAbility生命周期
    發(fā)表于 05-28 08:22

    UIAbility組件生命周期介紹

    UIAbility {// ...onDestroy() { // 系統(tǒng)資源的釋放、數(shù)據(jù)的保存等}}相關(guān)實(shí)例 針對(duì)UIAbility生命周期,有以下相關(guān)實(shí)例可供參考: UIAbility和自定義組件生命周期(ArkTS)(
    發(fā)表于 05-16 08:28

    EMC工程電磁兼容性測(cè)試整改:全生命周期管控體系

    深圳南柯電子|EMC工程電磁兼容性測(cè)試整改:全生命周期管控體系
    的頭像 發(fā)表于 04-28 11:17 ?937次閱讀
    EMC工程電磁兼容性測(cè)試整改:全<b class='flag-5'>生命周期</b>管控體系

    KaihongOS操作系統(tǒng):頁面的生命周期介紹

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

    KaihongOS操作系統(tǒng):UIAbility的生命周期

    狀態(tài)。系統(tǒng)會(huì)調(diào)用回調(diào),開發(fā)者可以在這里執(zhí)行清理操作,比如停止后臺(tái)任務(wù)、釋放資源等。 這些狀態(tài)和回調(diào)方法為開發(fā)者提供了UIAbility生命周期的監(jiān)控能力,使得開發(fā)者可以根據(jù)UIAbility的不同狀態(tài)
    發(fā)表于 04-25 07:04

    設(shè)備全生命周期數(shù)字孿生:從采購到報(bào)廢的智能決策閉環(huán)

    數(shù)字孿生技術(shù)為企業(yè)打造設(shè)備全生命周期數(shù)據(jù)驅(qū)動(dòng)的智能閉環(huán)”,大幅提升設(shè)備選型、運(yùn)維、報(bào)廢決策效率,縮短安裝周期。通過全息感知、模擬推演和決策優(yōu)化,實(shí)現(xiàn)設(shè)備從“經(jīng)驗(yàn)運(yùn)維”到“算法驅(qū)動(dòng)”的
    的頭像 發(fā)表于 03-28 10:23 ?976次閱讀
    設(shè)備全<b class='flag-5'>生命周期</b>數(shù)字孿生:從采購到報(bào)廢的智能決策閉環(huán)

    一文讀懂產(chǎn)品生命周期管理系統(tǒng)(PLM)?

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