前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android面试题之Kotlin Jetpack组件LifecycleScope

Android面试题之Kotlin Jetpack组件LifecycleScope

作者头像
AntDream
发布于 2024-06-13 13:07:49
发布于 2024-06-13 13:07:49
28900
代码可运行
举报
运行总次数:0
代码可运行

Kotlin中,LifecycleScopeAndroid Jetpack架构组件的一部分,主要用于简化与生命周期相关的协程管理。 它属于androidx.lifecycle:lifecycle-runtime-ktx库的一部分,通过结合使用 LifecycleOwner 和协程,简化了协程与Android生命周期的整合。

什么是 LifecycleScope?

LifecycleScope 是一个扩展属性,可以在LifecycleOwner(如ActivityFragment)中使用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public val LifecycleOwner.lifecycleScope: LifecycleCoroutineScope
    get() = lifecycle.coroutineScope

在这个范围内启动的协程都会在对应的生命周期被取消,避免内存泄漏和无效操作。例如,当一个 Activity 被销毁时,在 LifecycleScope 内启动的协程会自动取消。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
lifecycleScope.launch {
    // 在 Activity 或 Fragment 的 lifecycleScope 中启动的协程
}

launchWhenCreated/Resumed等 API 的区别

这些 API 用于在特定的生命周期状态下启动协程,并且在适当的时候暂停和恢复它们。

1. launchWhenCreated

  • Lifecycle 处于 CREATED 状态及更高状态时启动协程。
  • 如果在 CREATED 状态之前调用,则会挂起,直到生命周期达到 CREATED 状态。
  • 在其他状态下(如ON_STARTON_RESUME)调用时,协程立即开始执行。
  • 取消条件:如果生命周期从 CREATED 状态降到 DESTROYED,协程会被取消。例如,在 Activity 或 Fragment 被销毁时,协程会被取消。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
lifecycleScope.launchWhenCreated {
    // 代码将在生命周期至少处于 CREATED 状态时执行
}

2. launchWhenStarted

  • Lifecycle 处于 STARTED 状态及更高状态时启动协程。
  • 如果在 STARTED 状态之前调用,则会挂起,直到生命周期达到 STARTED 状态。
  • 在其他状态下(如ON_RESUME)调用时,协程立即开始执行。
  • 如果生命周期从 STARTED 状态降到 CREATED,协程会被暂停。
  • 如果生命周期从 CREATED 状态降到 DESTROYED,协程会被取消。例如,在 Activity 或 Fragment 被销毁时,协程会被取消。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
lifecycleScope.launchWhenStarted {
    // 代码将在生命周期至少处于 STARTED 状态时执行
}

3. launchWhenResumed

  • Lifecycle 处于 RESUMED 状态时启动协程。
  • 如果在 RESUMED 状态之前调用,则会挂起,直到生命周期达到 RESUMED 状态。
  • RESUMED 状态下调用时,协程立即开始执行。
  • 如果生命周期从 RESUMED 状态降到 STARTED,协程会被暂停。
  • 如果生命周期从 CREATED 状态降到 DESTROYED,协程会被取消。例如,在 Activity 或 Fragment 被销毁时,协程会被取消。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
lifecycleScope.launchWhenResumed {
    // 代码将在生命周期处于 RESUMED 状态时执行
}
简单总结
  • launchWhenCreated:确保协程在生命周期至少为 CREATED 时执行,只有在生命周期降到 DESTROYED 时才会被取消。
  • launchWhenStarted:确保协程在生命周期至少为 STARTED 才会执行,当降到 CREATED 时暂停,降到 DESTROYED 时取消。
  • launchWhenResumed:确保协程仅在生命周期为 RESUMED 时执行,当降到 STARTED 时暂停,降到 DESTROYED 时取消。
使用 LifecycleScope 避免内存泄漏

使用 LifecycleScope 和相关的launchWhenCreated/Resumed 等API,可以确保协程在组件生命周期的适当时机被启动和取消,从而有效避免内存泄漏。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ExampleActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_example)

        // 使用 LifecycleScope 启动协程
        lifecycleScope.launchWhenResumed {
            // 假设这个任务需要长时间运行
            delay(10000)
            // 更新 UI 或执行一些与 Activity 相关的操作
            findViewById<TextView>(R.id.textView).text = "任务完成"
        }
    }
}
  • LifecycleScope:关联到 ActivityFragment 的生命周期。当 ActivityFragment 被销毁时,所有在 LifecycleScope 中启动的协程都会自动取消。
  • launchWhenResumed: 在 Activity 的生命周期至少达到 RESUMED 状态时协程启动。当 Activity 被销毁(例如屏幕旋转或用户离开),生命周期会先降到 STARTED(如果用户稍后返回该活动),继而完全销毁,这时协程会自动取消,不会保留对 Activity 的引用,从而避免内存泄漏。

END

点亮【赞和在看】,让钱和爱都流向你。

心里种花,人生才不会荒芜,如果你也想一起成长,请点个关注吧。

作者介绍

中年程序猿,十年移动端开发老司机,分享一线开发经验和知识,正在探索通过副业渡过中年危机

越努力越幸运,加油💪,一起遇见更好的自己

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AntDream 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
安卓软件开发-手把教讲解Kotlin协程
开发 Android App,很多操作是耗时的,比如网络请求、数据库操作。这些任务如果不处理好,会卡住整个App。为了解决这个问题,Kotlin 协程提供了一种简单的方法来处理耗时操作。
Nimyears
2024/09/05
3320
再谈协程之Lifecycle潜行者
https://developer.android.com/topic/libraries/architecture/lifecycle
用户1907613
2021/11/02
8230
再谈协程之Lifecycle潜行者
关于Lifecycle的基本使用,这里就不详细介绍了,毕竟官网讲的很清楚了,而且大部分时间,我们也用太感知细节,这也是JetPack的魅力所在。
玖柒的小窝
2021/11/03
3810
再谈协程之Lifecycle潜行者
理解协程、LiveData 和 Flow
从 API 1 开始,处理 Activity 的生命周期 (lifecycle) 就是个老大难的问题,基本上开发者们都看过这两张生命周期流程图:
Android 开发者
2020/05/18
2.3K0
理解协程、LiveData 和 Flow
手把手教你搭建android模块化项目框架番外(一) launchWhenResumed Deprecated
在androidx.lifecycle:lifecycle-common:2.6.1中,lifecycleScope.launchWhenResumed 标记了Deprecated
支离破碎_superLee
2023/09/01
3230
Lifecycle:生命周期感知型组件的基础 —— Jetpack 系列(1)
Lifecycle 的主要作用是简化实现生命周期感知型组件的复杂度。 在传统的方式中,需要手动从外部宿主(如 Activity、Fragment 或自定义宿主)中将生命周期事件分发到功能组件内部,这势必会造成宿主代码复杂度增加。例如:
用户9995743
2022/09/26
1.2K0
Lifecycle:生命周期感知型组件的基础 —— Jetpack 系列(1)
Android SingleLiveEvent Redux with Kotlin Flow
这个系列我做了协程和Flow开发者的一系列文章的翻译,旨在了解当前协程、Flow、LiveData这样设计的原因,从设计者的角度,发现他们的问题,以及如何解决这些问题,pls enjoy it。
用户1907613
2021/12/15
1.1K0
【协程】LifecycleScope源码解析
使用协程,相信很多同学已经信手拈来了,但是也有很多同学是不知道LifecycleScope的。
yechaoa
2022/06/10
7750
Lifecycle详细分析
Lifecycle源码分析 目录介绍 01.Lifecycle的作用是什么 02.Lifecycle的简单使用 03.Lifecycle的使用场景 04.如何实现生命周期感知 05.注解方法如何被调用 06.addObserver调用分析 07.知识点梳理和总结一下 00.使用AAC实现bus事件总线 利用LiveData实现事件总线,替代EventBus。充分利用了生命周期感知功能,可以在activities, fragments, 或者 services生命周期是活跃状态时更新这些组件。支持发送普通事件
杨充
2020/03/09
4390
Jetpack 笔记之——Lifecycle 浅析
Android 这些年的发展还是挺快的,不仅推出了全新的 Kotlin 语言替代 Java,还推出了一系列的 Jetpack 工具库。如果现在还不知道 Jetpack,那就说明同学你该补补课了。本笔记是 Jetpack 中 Lifecycle 的介绍与浅析,期待还有后续。(应该会有,因为学无止境啊~)
修之竹
2022/08/19
8310
Jetpack 笔记之——Lifecycle 浅析
Android Jetpack架构组件(四)之LiveData
LiveData是Jetpack架构组件Lifecycle 库的一部分,是一个可感知生命周期的可观察容器类 (Observable)。与常规的可观察类不同,LiveData 具有生命周期感知能力,这意味着它具有感知应用组件(如 Activity、Fragment 或 Service)的生命周期的能力,并且LiveData仅更新处于活跃生命周期状态的应用组件观察者。
xiangzhihong
2020/12/21
3.6K0
Android Lifecycle 深度解剖:三大类、五种状态、七大事件全面解读!
Android Lifecycle 是Jetpack组件库中的一个重要组件,它可以帮助我们更好地管理Activity、Fragment等组件的生命周期,从而避免内存泄漏和其他问题。本文将从以下几个方面来介绍Lifecycle的实现原理与使用技巧:
Rouse
2024/01/17
1.3K0
Android Lifecycle 深度解剖:三大类、五种状态、七大事件全面解读!
Android从零开始搭建MVVM架构(5)—— LifeCycle详解
1.Lifecycle简介 为什么要使用lifecycle? activity 和fragment 是有声明周期的,有时候,我们的很多操作需要写在声明周期的方法中,比如,下载,文件操作等,这样很多情况下回导致,我们在activity中的声明周期方法中写越来越多的代码,activity或者fragment 越来越臃肿,代码维护越来越困难。 使用lifecycle就可以很好的解决这类问题。 lifecycle代码简洁,我们可以通过实现LifecycleObserver 接口,来监听声明周期,然后我们在activity和fragment中去注册监听。
老马的编程之旅
2022/06/22
8830
Android 官方架构组件(一)——Lifecycle
Lifecycle 组件指的是 android.arch.lifecycle 包下提供的各种类与接口,可以让开发者构建能感知其他组件(主要指Activity 、Fragment)生命周期(lifecycle-aware)的类。
分你一些日落
2021/12/16
6570
【AAC 系列二】深入理解架构组件的基石:Lifecycle
在前文,我就提到 Android Architecture Components ,是一个帮助开发者设计 健壮 、 可测试 且 可维护的一系列库的集合。
程序亦非猿
2019/08/16
1K0
【AAC 系列二】深入理解架构组件的基石:Lifecycle
深入理解与运用Android Jetpack Lifecycle
Android Jetpack 是 Google 推出的一套强大且灵活的库集合,旨在帮助 Android 开发者构建高质量、稳定且易于维护的应用程序。其中最重要的组件之一是 Lifecycle,它提供了一种便捷的方式来管理 Android 应用程序组件的生命周期,使得开发者能够更加专注于应用逻辑的实现而不用过多关心生命周期管理。本篇文章将深入浅出地介绍 Android Jetpack Lifecycle 的使用原理,带你一步步走进它的核心机制,同时展示一些高级的使用方式,助你在 Android 开发的路上更进一步。
Rouse
2023/08/31
2570
深入理解与运用Android Jetpack Lifecycle
由浅入深,详解 Lifecycle 生命周期组件的那些事
在2022的今天,AndroidX 普遍的情况下,JetPack Lifecycle 也早已经成为了开发中的基础设施,小到 View(扩展库) ,大到 Activity,都隐藏着它的身影,而了解 Lifecycle 也正是理解 JetPack 组件系列库生命感知设计的基础。
Petterp
2022/12/07
7040
由浅入深,详解 Lifecycle 生命周期组件的那些事
Jetpack组件之LifeCycle
3月4日,Google重磅发布了 Flutter 2 !作为 Flutter 的重大升级,使用 Flutter 2 开发者可以用相同的代码,把使用 Flutter 开发的应用发布到五个操作系统:iOS,Android,Windows,macOS 和 Linux;以及运行到 Chrome 、 Firefo, Safari 或 Edge等浏览器的 Web 版本上,Flutter 甚至还可以嵌入到 Cars, TVs 和智能家电中。 作为一个Flutter开发者,也马上下载了Flutter 2.0 sdk,并将自己的Flutter项目运行到Chrome上,效果很好,就是代码中有些差别,Web端对图片以及dart的io包不支持等等。具体差异可以去Flutter官网查看。贴一张web端效果图。
八归少年
2022/06/29
1.3K0
Jetpack组件之LifeCycle
让Flows感知生命周期
这个系列我做了协程和Flow开发者的一系列文章的翻译,旨在了解当前协程、Flow、LiveData这样设计的原因,从设计者的角度,发现他们的问题,以及如何解决这些问题,pls enjoy it。
用户1907613
2022/01/27
7940
设计 repeatOnLifecycle API 背后的故事
通过本文您将会了解到 Lifecycle.repeatOnLifecycle API 背后的设计决策,以及为什么我们会移除此前添加到 lifecycle-runtime-ktx 库 2.4.0 版本首个 alpha 版中的几个辅助函数。
Android 开发者
2022/03/09
9350
相关推荐
安卓软件开发-手把教讲解Kotlin协程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验