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

    文章

    3985

    浏览量

    133069
  • API
    API
    +关注

    关注

    2

    文章

    2147

    浏览量

    66239
  • 数据流
    +关注

    关注

    0

    文章

    129

    浏览量

    15660

原文标题:在 Jetpack Compose 中安全地使用数据流

文章出处:【微信号:Google_Developers,微信公众号:谷歌开发者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    ALM(应用生命周期管理)解析:一文了解其概念、关键阶段及Perforce ALM工具推荐

    什么是ALM(应用生命周期管理)?它远不止是SDLC!一文了解其概念、关键阶段以及如何借助Perforce ALM这类工具,实现端到端的可追溯性、加速发布并保障合规性。
    的头像 发表于 09-19 11:03 1252次阅读
    ALM(应用<b class='flag-5'>生命周期</b>管理)解析:一文<b class='flag-5'>了解</b>其概念、关键阶段及Perforce ALM工具推荐

    如何利用技术实现装置数据验证的全生命周期管理?

    装置数据验证的全生命周期管理,需覆盖 需求规划、数据采集、自动化验证、存储归档、应用迭代、退役审计 6 大核心阶段。利用技术实现这一闭环,需针对各阶段的痛点匹配工具与方案,同时兼顾数据
    的头像 发表于 09-05 15:23 522次阅读
    如何利用技术实现装置<b class='flag-5'>数据</b>验证的全<b class='flag-5'>生命周期</b>管理?

    【HarmonyOS 5】鸿蒙页面和组件生命周期函数

    【HarmonyOS 5】鸿蒙页面和组件生命周期函数 ##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财# 一、生命周期阶段: 创建阶段 build: 构建组件
    的头像 发表于 07-11 18:24 794次阅读

    CYW20706的生命周期状态如何?

    CYW20706的生命周期状态如何? 我注意到CYW20706不再列在AIROC™ Bluetooth® LE& Bluetooth® 下。贸泽现在还将该器件列为不建议用于未来设计。 对于CYW20706来说,什么是好的更换零件。 还会有支持 LE Audio 的双栈蓝牙 SoC 吗?
    发表于 07-04 07:25

    关于生命周期中的aboutToAppear和onPageShow的理解和应用

    过程、应用进入前台等场景,仅@Entry装饰的自定义组件作为页面时生效。 从两者相同的角度来说,其都是在自定义组件显示后,主动去触发的生命周期,在这两个生命周期里可以写一些数据获取啊等相关的操作(比如
    发表于 06-30 17:32

    ServiceAbility的生命周期介绍

    ServiceAbility的生命周期 开发者可以根据业务场景重写生命周期相关接口。ServiceAbility生命周期接口说明见下表。 表1 ServiceAbility生命周期
    发表于 05-28 08:22

    UIAbility组件生命周期介绍

    UIAbility {// ...onDestroy() { // 系统资源的释放、数据的保存等}}相关实例 针对UIAbility生命周期,有以下相关实例可供参考: UIAbility和自定义组件生命周期(ArkTS)(
    发表于 05-16 08:28

    KaihongOS操作系统:页面的生命周期介绍

    页面的生命周期 在KaihongOS中,学习页面的生命周期前需要先了解自定义组件。 1. 自定义组件(Component) 自定义组件是通过@Component装饰的UI单元,可以组合多个系统
    发表于 04-25 08:18

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

    状态。系统会调用回调,开发者可以在这里执行清理操作,比如停止后台任务、释放资源等。 这些状态和回调方法为开发者提供了UIAbility生命周期的监控能力,使得开发者可以根据UIAbility的不同状态
    发表于 04-25 07:04

    设备全生命周期数字孪生:从采购到报废的智能决策闭环

    数字孪生技术为企业打造设备全生命周期数据驱动的智能闭环”,大幅提升设备选型、运维、报废决策效率,缩短安装周期。通过全息感知、模拟推演和决策优化,实现设备从“经验运维”到“算法驱动”的
    的头像 发表于 03-28 10:23 801次阅读
    设备全<b class='flag-5'>生命周期</b>数字孪生:从采购到报废的智能决策闭环

    一文读懂产品生命周期管理系统(PLM)?

    在当今快速迭代的制造业和科技领域,企业能否高效管理产品从概念到退市的全生命周期,已成为其核心竞争力的重要体现。产品生命周期管理系统(Product Lifecycle Management, PLM
    的头像 发表于 03-10 17:09 2053次阅读
    一文读懂产品<b class='flag-5'>生命周期</b>管理系统(PLM)?

    医疗设备全生命周期管理,守护健康生命线

    医疗设备全生命周期管理是保障医疗服务的关键,其中物联网技术实现设备实时监测,大数据分析助力精准维护决策,为设备健康管理带来了革命性变化。
    的头像 发表于 03-03 10:30 813次阅读
    医疗设备全<b class='flag-5'>生命周期</b>管理,守护健康<b class='flag-5'>生命</b>线

    PLM产品生命周期管理系统需要采集哪些数据

    理念和技术手段,通过集成和管理产品相关的所有信息,包括设计数据、工艺流程、质量控制、供应链信息等,实现对产品全生命周期的有效管理。 其中,数据采集的PLM系统的根基。比如在生产制造环节,通过采集生产过程中的质量
    的头像 发表于 02-24 17:13 889次阅读
    PLM产品<b class='flag-5'>生命周期</b>管理系统需要采集哪些<b class='flag-5'>数据</b>

    设备全生命周期管理系统,一站式管控设备 “一生”

    文章探讨了设备全生命周期管理的概念和实践,阐述了中设智控在设备全生命周期管理方面的技术优势和应用案例。文章指出,全生命周期管理的核心价值在于降低综合成本、延长设备寿命、提升生产效率和实现绿色可持续发展。
    的头像 发表于 02-21 10:09 1562次阅读
    设备全<b class='flag-5'>生命周期</b>管理系统,一站式管控设备 “一生”

    PLM解决方案,产品生命周期管理软件

    PLM解决方案产品生命周期管理软件规划、开发和交付超越客户期望的创新产品。借助我们适用于任意规模的可扩展、适应性强的PLM解决方案,利用准确的产品数据推动多学科团队之间的协作。优化产品生命周期客户
    的头像 发表于 02-10 10:15 844次阅读
    PLM解决方案,产品<b class='flag-5'>生命周期</b>管理软件