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

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

完善資料讓更多小伙伴認(rèn)識你,還能領(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)用,請使用 collectAsStateWithLifecycle API 以生命周期感知方式從用戶界面收集數(shù)據(jù)流。

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

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

collectAsStateWithLifecycle

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

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

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

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

△ 默認(rèn)情況下,當(dāng)應(yīng)用處于后臺時 collectAsStateWithLifecycle 會取消收集數(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 值時,都會重新組合 AuthorRoute。有關(guān) collectAsStateWithLifecycle 的更多用法,請參考 "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

如果您要在項目中使用 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 在實現(xiàn)機制上使用了 repeatOnLifecycle API,我們也推薦大家在 Android 視圖 (View) 系統(tǒng)中收集數(shù)據(jù)流的 API。

  • collectAsStateWithLifecycle 的實現(xiàn)機制
    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)該知道其他類型的實現(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ù)據(jù)層的上游數(shù)據(jù)流。您可以在生成界面狀態(tài)時使用 .stateIn(WhileSubscribed) 數(shù)據(jù)流 API 來執(zhí)行此操作。如需了解更多信息,請觀看 "Kotlin Flows 實戰(zhàn)" 講座的這一部分。如要測試以這種方法生成界面狀態(tài)的 ViewModel,請查看測試指南

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

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

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

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

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

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

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

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

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

如果 Android 開發(fā)者想滿足用戶的需求、確保設(shè)備系統(tǒng)健康,或 "為數(shù)十億用戶打造產(chǎn)品",則應(yīng)該根據(jù)其目標(biāo)市場、設(shè)備或國家/地區(qū)的實際情況來優(yōu)化上述這些因素。根據(jù)設(shè)備類型和設(shè)備上 Android 版本的不同,讓不必要的資源保持活躍可能會產(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)常會問道: 如果 collectAsStateWithLifecycle 是從 Android 可組合函數(shù)中收集數(shù)據(jù)流最安全的方法,那現(xiàn)在為什么還需要 collectAsState API?為什么不將生命周期感知功能添加到 collectAsState 中,而是創(chuàng)建新的 API?

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

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

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

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

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

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

collectAsStatecollectAsStateWithLifecycle 在 Compose 中各有用途。后者用于開發(fā) Android 應(yīng)用,前者用于在其他平臺進行開發(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)用的其他部分在需要時釋放資源。 如果您正在使用 Jetpack Compose 構(gòu)建 Android 應(yīng)用,請使用 collectAsStateWithLifecycle 可組合函數(shù)來執(zhí)行此操作。 另外: 感謝 Jose AlcérrecaMarton BraunAlejandra Stamato 和 Jake Roseman 對文章內(nèi)容進行審核。

  • 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)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Android
    +關(guān)注

    關(guān)注

    12

    文章

    3938

    瀏覽量

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

    關(guān)注

    2

    文章

    1505

    瀏覽量

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

    關(guān)注

    0

    文章

    120

    瀏覽量

    14372

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

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

收藏 人收藏

    評論

    相關(guān)推薦

    什么是PLM產(chǎn)品生命周期管理系統(tǒng)?

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

    如何確保車規(guī)級芯片全生命周期的安全

    為保障質(zhì)量、安全性和可靠性,汽車行業(yè)始終如一地貫徹著嚴(yán)苛的標(biāo)準(zhǔn)。然而,這種對汽車安全性和可靠性的堅定追求,也催生了對預(yù)測性維護的迫切需要,即在芯片生命周期管理(SLM)中,使用先進的監(jiān)測和分析技術(shù)來預(yù)測和預(yù)防半導(dǎo)體組件的故障。
    的頭像 發(fā)表于 08-12 10:47 ?529次閱讀
    如何確保車規(guī)級芯片全<b class='flag-5'>生命周期</b>的安全

    半導(dǎo)體全生命周期測試:哪些設(shè)備在默默守護你的電子產(chǎn)品?

    半導(dǎo)體產(chǎn)業(yè)作為現(xiàn)代電子工業(yè)的核心,其產(chǎn)品的全生命周期測試對于確保產(chǎn)品質(zhì)量、提高生產(chǎn)效率和降低成本具有重要意義。半導(dǎo)體全生命周期測試設(shè)備涵蓋了從原材料檢測到最終產(chǎn)品測試的一系列設(shè)備,本文將對這些設(shè)備進行詳細(xì)介紹。
    的頭像 發(fā)表于 07-01 09:38 ?356次閱讀
    半導(dǎo)體全<b class='flag-5'>生命周期</b>測試:哪些設(shè)備在默默守護你的電子產(chǎn)品?

    鴻蒙開發(fā)組件:DataAbility的生命周期

    應(yīng)用開發(fā)者可以根據(jù)業(yè)務(wù)場景實現(xiàn)data.js/data.ets中的生命周期相關(guān)接口。DataAbility生命周期接口說明見下表。
    的頭像 發(fā)表于 06-20 09:39 ?455次閱讀

    鴻蒙開發(fā):【PageAbility的生命周期

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

    設(shè)備全生命周期管理流程有哪些?

    采購與安裝階段設(shè)備全生命周期管理系統(tǒng)對設(shè)備需求進行分析,記錄設(shè)備信息,確保設(shè)備正確安裝并達(dá)到預(yù)期性能。維護保養(yǎng)階段制定科學(xué)維護計劃,定期檢查和保養(yǎng)。性能優(yōu)化與升級階段通過分析數(shù)據(jù)發(fā)現(xiàn)問題,優(yōu)化設(shè)備性能。
    的頭像 發(fā)表于 06-13 15:21 ?801次閱讀
    設(shè)備全<b class='flag-5'>生命周期</b>管理流程有哪些?

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

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

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

    元器件延長生命周期,解決這個問題的一種方法是在生產(chǎn)結(jié)束后長期儲存半導(dǎo)體元件。該解決方案使您能夠在設(shè)備的整個使用壽命期間持續(xù)供應(yīng)組件。01電子設(shè)備如果沒有組成它們的
    的頭像 發(fā)表于 05-31 13:59 ?568次閱讀
    如何保護電子元器件<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 生命周期階段有何不同?
    發(fā)表于 05-21 07:07

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

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

    IBM推出全新IT生命周期管理模式

    IBM近日正式推出了IBM Storage Assurance,這是一項創(chuàng)新的IT生命周期管理方案。其設(shè)計初衷在于為客戶提供數(shù)據(jù)中心管理的靈活性與控制權(quán),最大化系統(tǒng)性能。該方案融合了IBM FlashSystem的硬件和軟件創(chuàng)
    的頭像 發(fā)表于 05-09 11:47 ?605次閱讀

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

    近日,IBM 推出了 IBM Storage Assurance 這一全新的 IT 生命周期管理模式,旨在為客戶的數(shù)據(jù)中心提供靈活的選擇與控制,最大程度提高性能。
    的頭像 發(fā)表于 05-08 14:09 ?435次閱讀

    企業(yè)數(shù)據(jù)備份體系化方法論的七大原則:數(shù)據(jù)生命周期規(guī)劃:資產(chǎn)管理的新篇章

    在數(shù)字化浪潮中,數(shù)據(jù)如同新時代的石油,成為了推動企業(yè)前進的核心動力。但與所有寶貴資源一樣,如果我們不能妥善管理,這種無形的資產(chǎn)就難以發(fā)揮其應(yīng)有的價值。這就是為何數(shù)據(jù)生命周期規(guī)劃(DLP)顯得如此重要
    的頭像 發(fā)表于 03-11 14:24 ?363次閱讀

    什么是設(shè)備全生命周期管理系統(tǒng)?

    設(shè)備全生命周期管理系統(tǒng)是一款能夠?qū)υO(shè)備進行全周期數(shù)字化管理的軟件平臺,它通過將設(shè)備信息電子化,使得設(shè)備的管理和監(jiān)督更加便捷。這個系統(tǒng)不僅涵蓋了設(shè)備的采購、使用、維修、報廢等各個階段,還能夠?qū)υO(shè)備
    的頭像 發(fā)表于 02-26 14:21 ?1223次閱讀
    什么是設(shè)備全<b class='flag-5'>生命周期</b>管理系統(tǒng)?

    BCP為什么只有在收集數(shù)據(jù)后才存儲數(shù)據(jù)

    有很多不便之處,因為可以存儲在 BCP 中的收集數(shù)據(jù)的數(shù)量限制為 10,000。 為什么只有在收集數(shù)據(jù)后才存儲數(shù)據(jù)
    發(fā)表于 01-22 07:06
    主站蜘蛛池模板: 高清午夜毛片| 五月天狠狠| 曰韩毛片| 加勒比一木道|视频在线看| 97综合| 国内a级毛片免费···| 色多多www| 香蕉久久夜色精品国产2020 | 免费日本网站| 色校园| 四虎永久精品免费网址大全| 永久精品免费影院在线观看网站| 久久99久久精品国产99热| 91大神免费视频| 国产成人啪午夜精品网站| 影音先锋在线亚洲精品推荐| 国产片18在线观看| 国产―笫一页―浮力影院xyz| 奇米色吧| 人人干人人做| 2018天天操夜夜操| 男操女免费视频| avtom影院永久地址人人影院| 国模娜娜扒开嫩木耳| 日本69sex护士www| 国产免费好大好硬视频| 日本免费视频| www.亚洲日本| 一级特级aaa毛片| 色欧美色| 欧美+日本+国产+在线观看| 欧美色一级| 免费能直接在线观看黄的视频| 国产人成精品免费视频| αv天堂| 午夜窝窝| 天天操一操| 久久天天躁夜夜躁狠狠85台湾| 黄乱色伦短篇小说h| 1024人成软件色www| 九九精品免费观看在线|