当前位置:网站首页>Kotlin的协程与生命周期
Kotlin的协程与生命周期
2022-08-02 10:55:00 【Mr_Tony】
文章目录
一、前言
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---->","线程运行中....")
}
}
}
}
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 {
}
}
}
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时候,数据将不在发送直到重新恢复页面,才会发送数据,需要注意的是,实际测试中,逻辑并不会重新执行,而是在下次恢复时候把已经加载出来的数据直接发送
四、参考链接
边栏推荐
- MySql模糊查询大全
- 太帅了!我用炫酷大屏展示爬虫数据!
- 循环结构--while循环
- 深度学习100例 —— 卷积神经网络(CNN)实现mnist手写数字识别
- How to technically ensure the quality of LED display?
- LayaBox---TypeScript---Decorator
- 利用二维数据学习纹理三维网格生成(CVPR 2020)
- Shell script realizes multi-select DNS simultaneous batch resolution of domain name IP addresses (new update)
- Jay Chou's new song is released, crawl the "Mojito" MV barrage, and see what the fans have to say!
- SVN如何删除文件名包含空格的文件
猜你喜欢

Multithreading (Basic) - 40,000 word summary

一体化在线政务服务平台,小程序容器技术加速建设步伐

牛客刷题——剑指offer(第三期)

外包学生管理系统架构文档

只问耕耘,不问收获,其实收获却在耕耘中

How to technically ensure the quality of LED display?

突破边界,华为存储的破壁之旅

21年毕业转行软件测试,从0收入到月薪过万,我真的很幸运...

阿里CTO程立:阿里巴巴开源的历程、理念和实践

Jay Chou's new song is released, crawl the "Mojito" MV barrage, and see what the fans have to say!
随机推荐
LayaBox---TypeScript---Namespaces and modules
LayaBox---TypeScript---命名空间和模块
WPF 截图控件之文字(七)「仿微信」
LayaBox---TypeScript---Module
win10打印服务无法启动(运行时错误automation)
爆款视频怎么做?这里或许有答案!
Oracle降低高水位
Three.JS程序化建模入门
c#反射和特性
循环结构--while循环
FPGA手撕代码——CRC校验码的多种Verilog实现方式 (2021乐鑫科技数字IC提前批代码编程)
sqlmap安装教程用w+r打开(sqlyog安装步骤)
Outsourced Student Management System Architecture Documentation
开箱即用-使用异步加载布局来优化页面启动速度的几种方案
神通数据库,批量插入数据的时候失败
LayaBox---TypeScript---模块解析
LayaBox---TypeScript---Symbols
暑期总结3
全方位剖析Numpy中的np.diag源代码
微信小程序---组件开发与使用