Kotlin的协程与生命周期
文章目录
- 一、前言
- 二、引入依赖
- 三、代码示例
- 1、基础用法
- 2、repeatOnLifecycle
- 3、flowWithLifecycle
- 4、lifecycle.whenCreated、lifecycle.whenStarted 和 lifecycle.whenResumed
- 5、协程与LiveData
- 四、参考链接
一、前言
kotlin的协程在有时候还是挺方便的。jetpack提供了足够多的兼容,这里对其部分进行记录
二、引入依赖
implementation 'androidx.core:core-ktx:1.7.0'implementation 'androidx.fragment:fragment-ktx:1.5.0'implementation 'androidx.activity:activity-ktx:1.5.0'implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.5.1'
三、代码示例
1、基础用法
凡是实现了LifecycleOwner
接口的类都可以使用以下方式开启协程,例如Fragment
、ComponentActivity
及其子类
//可以使用以下方式开启协程度,优势在于自己不要处理页面结束后的关闭问题lifecycleScope.launch {}
ViewModel
viewModelScope.launch { }
2、repeatOnLifecycle
假如有一种需求需要根据页面的生命周期进行处理,比如说onStart
时候启动协程,onStop
时候停止协程,可以使用以下方式。这种生命周期被称为可重启生命周期感知型协程
override fun onCreate(savedInstanceState: Bundle?) {lifecycleListener()
}private fun lifecycleListener(){lifecycleScope.launch {repeatOnLifecycle(Lifecycle.State.STARTED){while (isActive){delay(1000)Log.e("YM---->","线程运行中....")}}}}
需要注意的是官方曾经提过一个函数addRepeatingJob
和这个函数类似,但是addRepeatingJob
已经在lifecycle-runtime-ktx:2.4.0-alpha01
中存在,在lifecycle-runtime-ktx:2.4.0-alpha02
时候已经移除了。参考链接如下:
repeatOnLifecycle API design story
3、flowWithLifecycle
如果是只是对一个数据流Flow
进行监听,可以使用以下方式
private fun lifecycleListener(){lifecycleScope.launch {(1..9).asFlow().flowWithLifecycle(lifecycle,Lifecycle.State.STARTED).collect{println("YM---->value:$it")}}}
由于flowWithLifecycle
是Flow
的函数,所以可以将其挂在在热流StateFlow
或ShareFlow
上面。多个流的话只能还使用上述repeatOnLifecycle
的方式
4、lifecycle.whenCreated、lifecycle.whenStarted 和 lifecycle.whenResumed
repeatOnLifecycle
可以将活动限制在某个范围之内,但是这个会随着生命周期的反复来进行重复启动,但是假如,只使用一次的话则无需如此,可以使用以下方式,
class MyFragment: Fragment {init {lifecycleScope.launch {whenStarted {}}//或者lifecycleScope.launchWhenCreated { }}
}
不过这个写法有时候会出现层层嵌套的问题,也可以使用以下写法
val isCreated = lifecycle.currentState.isAtLeast(Lifecycle.State.CREATED)if (!isCreated) return
5、协程与LiveData
在使用LiveData
时候,我们有时候需要异步获取内容,通常来说是创建LiveData
,然后在onCreate()
中去主动加载数据,以下方式可以简化这一操作
private val user: LiveData<Int> = liveData {// val data = database.loadUser() // loadUser is a suspend function.//delay(5000)emit(10)}override fun onCreate(savedInstanceState: Bundle?) {lifecycleListener()}private fun lifecycleListener(){user.observe(this){Log.e("YM---->"," 参数:$it")}}
以下引用自官网
当 LiveData 变为活动状态时,代码块开始执行;当 LiveData
变为非活动状态时,代码块会在可配置的超时过后自动取消。如果代码块在完成前取消,则会在 LiveData
再次变为活动状态后重启;如果在上次运行中成功完成,则不会重启。请注意,代码块只有在自动取消的情况下才会重启。如果代码块由于任何其他原因(例如,抛出
CancellationException)而取消,则不会重启。
当页面进入onStop
时候,数据将不在发送直到重新恢复页面,才会发送数据,需要注意的是,实际测试中,逻辑并不会重新执行,而是在下次恢复时候把已经加载出来的数据直接发送
四、参考链接
- kotlin协程Flow的StateFlow和SharedFlow(十二)
- 将 Kotlin 协程与生命周期感知型组件一起使用
- Jetpack之LifeCycle
- kotlin协程Flow的StateFlow和SharedFlow(十二)
- Jetpack之LifeCycle
Kotlin的协程与生命周期相关推荐
- Kotlin 之 协程
初识协程,启动取消协程,Flow异步流,协程并发 目录 (一)初识协程 协程是什么? Android中协程解决了什么问题? 协程的挂起与恢复 挂起和阻塞 协程的调度器 Dispatchers 任务泄露 ...
- Kotlin中协程理解与实战(一)
Kotlin中协程理解与实战(一) 什么是协程 在Android中协程用来解决什么问题 协程是: suspend -也称为挂起或暂停,用于暂停执行当前协程,并保存所有局部变量: resume -用于让 ...
- 【对比Java学Kotlin】协程简史
文章目录 一.概念释义 1.1 协程定义 1.2 与线程的关系 1.3 协程简史 二.种类划分 2.1 按调用栈分类 2.2 按调度方式分类 三.异步编程 3.1 多线程 3.2 回调 3.3 Pro ...
- 十一、kotlin的协程(一)
theme: Chinese-red 学习的前提 java线程需要大概知道点 协程是线程执行的任务, 协程和用户线程的区别在于, 协程背靠强大的编译器, 协程有专属于协程的调度器和一堆方便好用的函数, ...
- Kotlin高级协程
Kotlin高级协程 一.前言 二.先从线程说起 三.协程的设计思想 四.协程特点:优雅的实现移步任务 五.协程基本使用 六.协程和线程相比有什么特点,如何优雅的实现异步任务 一.前言 在文章正式上干 ...
- Kotlin(3)-协程和操作符重载,Java程序员秋招三面蚂蚁金服
Kotlin 文件和类不存在一对一关系 共生体 继承 修饰符 空指针问题 正文 重难点 协程 想了很久,关于协程的内容,在官网上确实有很多内容,基础知识概念,基本使用,以及 流操作,通道,异常处理,并 ...
- kotlin coroutines 协程教程-入门用法
kotlin coroutines 协程教程-入门用法 Coroutine 协程,是kotlin 上的一个轻量级的线程库,对比 java 的 Executor,主要有以下特点: 更轻量级的 api 实 ...
- 十一、kotlin的协程 - 缓存、volatile、内存屏障和cas(四) --- 跑题篇
本章写着写着就跑题了, 又不舍得删除, 新手看 # 协程的共享变量安全问题简单入门和## volatile 不保证原子性部分代码, 其他可以不看, 太乱, 也没用 协程的共享变量安全问题简单入门 在使 ...
- Kotlin Mvp 协程 Retrofit整合
附MVP模板生成器 1.BaseModuleActivity处理loading相关逻辑 2.BaseModuleModel提供mRepositoryManager处理网络请求 3.BaseMouleP ...
最新文章
- MLCC噪声啸叫及对策
- C/S模型UDP实现
- 网络组Network Teaming
- 网友提问:当我要使用一个陌生的标准BAPI,我可以去哪里找到比较详尽的文档指导一类的资料
- Atom与markdown
- [Redux/Mobx] Redux怎样重置状态?
- 【hihocoder - offer编程练习赛60 B】最大顺子(双指针,思维)
- HttpHandler HttpModule入门篇
- 以软件开发周期来说明不同的测试的使用情况
- WP7模拟器使用技巧
- 缓存和数据库同步问题解决方案
- dnf怎么显示连接服务器失败怎么回事,登录DNF显示连接不到服务器怎么办 服务器连接失败解决方法...
- 【ECS】云服务器ECS是什么
- 教妹学Java(十四):switch 语句详解
- android 瀑布流 的实现
- OpenCV读取文件夹下的图片生成视频(mp4格式)
- 第12章 智能优化算法(ACO)
- 用python练习日语五十音图
- 一名职业操盘手对交易的理解
- 前端入门学习之 html5
热门文章
- AutoSar之微控制器抽象层MCAL
- 【Java SE】多线程
- 戴尔笔记本把计算机弄到桌面,戴尔笔记本电脑可不可以把程序放在桌面上-戴尔笔记本电脑怎么样...
- wordcount程序中,输出文件夹中为空
- 南京大学2021计算机考研复试线是多少,2021南京大学
- 免费多功能转码机器人(小程序转码机器人)
- Java终结者和捷安特pp_终结者致命的弱点-我会怎么对付终结者
- android 符号表情显示乱码,android输入框限制输入法中的表情符号
- ubuntu上的图片编辑工具-Pinta(品他病)
- 如何用服务器内存做系统盘,服务器内存扩容怎么做