首页 > 其他分享 >Jetpack Compose 生命周期介绍

Jetpack Compose 生命周期介绍

时间:2024-11-21 17:14:54浏览次数:3  
标签:生命周期 remember Jetpack Compose UI Recomposition 2.4

文章目录


前言

Jetpack Compose 的生命周期与传统的 View 不同,它主要基于 CompositionRecomposition 两个阶段来管理 UI 的创建和更新,同时通过一些工具(如 LaunchedEffectDisposableEffect)来处理生命周期事件。


提示:以下是本篇文章正文内容,下面案例可供参考

1、Compose UI 的生命周期是什么?

Compose 的生命周期围绕以下三个阶段展开:

  • 初次 Composition
    UI 的首次构建阶段,相当于传统 View 的 onCreate()。

  • Recomposition
    当状态发生变化时,Compose 只更新受影响的 UI 部分,类似于传统 View 的 onDraw()。

  • Disposal(销毁)
    UI 不再需要时的资源清理阶段,相当于传统 View 的 onDestroy()。

生命周期流转图

在这里插入图片描述

Compose 生命周期与传统生命周期的对比

传统 View 生命周期Compose 生命周期
onCreate()初次 Composition
onStart() / onResume()通过 LaunchedEffect 初始化资源
onPause() / onStop()无明确对应,状态由生命周期感知管理
onDestroy()DisposableEffect 的清理回调
onDraw()Recomposition

2、各阶段详细解析

2.1 初次 Composition:UI 的出生

这是 Compose UI 生命周期中的第一步
当你第一次调用 @Composable 函数时,Compose 会构建 UI 树并为其分配内存。
这就相当于传统 Android 中的 onCreate(),即 UI 组件的初始化阶段。

关键点:

  • Compose 会将 UI 树构建在内存中,并关联 UI 元素和数据源。
  • 在这阶段,所有的初始状态都会被设置。

示例代码:

@Composable
fun Greeting(name: String) {
    // 使用 `remember` 保存状态,仅在初次 Composition 初始化
    val greetingMessage = remember { "Hello, $name!" }
    Text(text = greetingMessage)
}

重点解析:

  • remember 会记住数据,避免每次 UI 更新时重新初始化。

2.2 Recomposition(UI 更新)

Recomposition 是 Compose 最强大的特性之一。当状态发生变化时,Compose 会高效地更新受影响的 UI 部分,而不是重新创建整个 UI 树。
比如,用户点击按钮或数据源发生变化时,只会重新绘制有变化的部分。

关键点:

  • 高效更新:Compose 会精确地追踪状态的变化,仅更新变化的部分,而不是重绘整个屏幕。
  • Recomposition 是 按需 触发的,而不是每次都发生,极大提升了性能。
    示例代码:
@Composable
fun Counter() {
    val count = remember { mutableStateOf(0) }

    Column {
        Button(onClick = { count.value++ }) {
            Text("点击次数: ${count.value}")
        }
        if (count.value > 5) {
            Text("点击超过5次了!")
        }
    }
}

重点:
当 count.value 发生变化时,只有 Button 和 Text 会重新组合,其他部分保持不变。

2.3 Disposal(资源清理)

Disposal 阶段发生在 UI 组件被销毁时。这时,Compose 会清理相关的资源,释放内存
这相当于传统 Android 中的 onDestroy(),比如关闭监听器、取消任务或释放占用的资源。

关键点:

  • UI 被移除后,相关的资源会被清理。
  • 这可以通过 DisposableEffect 等 Compose API 来显式管理。

示例代码:

@Composable
fun DisposableEffectExample() {
    DisposableEffect(Unit) {
        // 初始化资源
        println("资源初始化")
        onDispose {
            // 清理资源
            println("资源销毁")
        }
    }
}

重点:
onDispose 回调会在 UI 被移除时触发,适合做资源清理工作,如注销监听器、关闭连接等。

2.4 生命周期管理与状态控制

在 Compose 中,状态变化控制着 UI 的构建和更新,所有 UI 组件的变化都可以通过状态的更新来驱动。以下是与生命周期相关的几个关键 API,它们帮助我们更好地管理资源和 UI 更新:

2.4.1 LaunchedEffect(启动协程)

LaunchedEffect 用于启动协程并执行与 UI 生命周期相关的异步任务。协程在 @Composable 函数的初次 Composition 或 key 变化时启动,并在函数销毁时取消。

@Composable
fun TimerExample() {
    val time = remember { mutableStateOf(0) }

    // 每秒更新一次计时器
    LaunchedEffect(Unit) {
        while (true) {
            kotlinx.coroutines.delay(1000)
            time.value++
        }
    }

    Text(text = "计时器: ${time.value} 秒")
}

2.4.2 DisposableEffect(清理资源)

DisposableEffect 用来管理与 UI 绑定的外部资源,确保在组件销毁时清理资源。

示例代码:

@Composable
fun LifecycleAwareComponent() {
    val lifecycleOwner = LocalLifecycleOwner.current
    DisposableEffect(lifecycleOwner) {
        val observer = LifecycleEventObserver { _, event ->
            println("Lifecycle event: $event")
        }
        lifecycleOwner.lifecycle.addObserver(observer)
        onDispose {
            lifecycleOwner.lifecycle.removeObserver(observer)
        }
    }
}

2.4.3 SideEffect

在 Recomposition 之后触发副作用,用于通知外部系统。
触发时机:每次 Recomposition 完成时。

示例代码:

@Composable
fun SideEffectExample(counter: Int) {
    SideEffect {
        println("Recomposition 完成,当前计数: $counter")
    }
    Text(text = "计数: $counter")
}
  • SideEffect 通常用于更新非 Compose 管理的系统状态(如日志或外部变量)。
  • 每次 UI 更新后都会触发。

2.4.4 remember(状态记忆)

remember 用于在 Composition 期间保存状态,它避免了在每次 Recomposition 时重建数据,特别适用于在状态不变时保留数据。

示例代码:

@Composable
fun Counter() {
    val count = remember { mutableStateOf(0) }
    Button(onClick = { count.value++ }) {
        Text("点击次数: ${count.value}")
    }
}

总结

  • Jetpack Compose 的生命周期分为 Composition、Recomposition 和 Disposal。
  • 核心工具:
    LaunchedEffect:处理异步任务,与 UI 生命周期绑定。
    DisposableEffect:管理资源的初始化和清理。
    remember 和 mutableStateOf:保存 UI 状态。
    SideEffect:处理与外部系统的交互。
  • 与传统 View 生命周期相比,Compose 更关注状态变化驱动的重组和资源管理,避免了冗余的生命周期回调。

标签:生命周期,remember,Jetpack,Compose,UI,Recomposition,2.4
From: https://blog.csdn.net/weixin_44780781/article/details/143950022

相关文章

  • C# WPF 生命周期
    在C#WPF应用程序中,Window的生命周期是指窗口从创建到关闭的整个过程。理解WPF窗口的生命周期对于管理资源、事件处理以及进行性能优化等都至关重要。以下是WPF中窗口(Window)生命周期的主要阶段,以及在这些阶段中可以使用的事件和方法。1. 窗口的创建与初始化当WPF窗口被创建时,系......
  • 如何使用 Docker Compose 安装 WireGuard UI
    简介wireguard是什么?维基百科是这样描述的:WireGuard是一种实现加密虚拟专用网络(VPN)的通信协议和免费开源软件,其设计目标是易于使用,高速性能和低攻击面。它旨在比IPsec和OpenVPN这两种常见的隧道协议具有更好的性能和更强大的功能;WireGuard协议通过UDP传递流量。通过......
  • uniapp开发微信小程序笔记5-介绍三类生命周期
    一、uni-app的生命周期分为三类:应用的生命周期:指的是针对整个小程序的生命周期,写在App.vue中;页面的生命周期:指的是项目pages目录中每一个页面的生命周期;组件的生命周期:指的是项目compontents目录中自定义的每一个组件文件的生命周期。1、应用的生命周期:函数名说明平台兼容on......
  • 鸿蒙hvigor构建任务依赖与生命周期简介
    Hivgor脚本文件在构建的生命周期中Hvigor使用两个脚本文件来完成插件、任务以及生命周期hook的注册:hvigorconfig.ts:此文件在整个项目中只有根目录下存在一份,不是构建必须的文件并且默认不存在,如有需要可自行创建,此文件被解析执行的时间较早,可用于在Hvigor生命周期刚开始时操作......
  • Pod生命周期
    文章目录Pod生命周期Pod生命周期概述Init容器容器探针事件处理函数Pod资源管理Pod资源管理资源管理概述资源配额资源限额全局资源管理全局配额概述ResourceQuotaPod生命周期Pod生命周期概述什么是Pod生命周期?Pod对象自从其创建开始至终止的时间范围称为生命周......
  • vllm docker-compose
    version:'3'services:moonlit-vllm-qwen-hotvideo:image:vllm/vllm-openai:v0.6.2container_name:hitvideos_apirestart:alwayscommand:["--served-model-name","qwen2.5-14b-hitvideos","......
  • 关于Spring生命周期控制的接口:SmartLifecycle
    在Spring框架中,SmartLifecycle接口和StopWatch类都是用来管理和监测应用行为的强大工具。SmartLifecycle提供了对Springbeans生命周期的细粒度控制,而StopWatch用于精确测量代码段的执行时间,对于性能分析和优化非常有用。下面,我们将结合SmartLifecycle和StopWatch......
  • docker compose网络
    基本概念默认情况下,Compose会为我们的应用创建一个网络,服务的每个容器都会加入该网络中。这样,容器就可被该网络中的其他容器访问,不仅如此,该容器还能以服务名称作为hostname被其他容器访问。默认情况下,应用程序的网络名称基于Compose的工程名称,而项目名称基于docker-compose.yml......
  • 【01期】你能说说Spring框架中Bean的生命周期吗?
    前言:在当今技术快速迭代的大背景下,每位开发者都在不懈努力,学习最新的技术和框架,只为能在众多求职者中脱颖而出,获得理想中的大厂Offer。然而,面对网上海量且质量参差不齐的面试资料,许多朋友可能会感到迷茫和困惑。为了帮助大家更高效地准备面试,我精心搜集并整理了一份涵盖各大互......
  • docker-compose安装pgsql和pgvector
    快速安装PostgreSQL和pgvector1、创建Dockerfile文件,代码如下:#使用PostgreSQL16基础镜像FROMpostgres:16#安装pgvectorRUNapt-getupdate&&\apt-getinstall-ypostgresql-16-pgvector&&\rm-rf/var/lib/apt/lists/*#设置启动命令CMD["postgr......