文章目录

  • 一、前言
  • 二、引入依赖
  • 三、代码示例
    • 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接口的类都可以使用以下方式开启协程,例如FragmentComponentActivity及其子类

 //可以使用以下方式开启协程度,优势在于自己不要处理页面结束后的关闭问题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")}}}

由于flowWithLifecycleFlow的函数,所以可以将其挂在在热流StateFlowShareFlow上面。多个流的话只能还使用上述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时候,数据将不在发送直到重新恢复页面,才会发送数据,需要注意的是,实际测试中,逻辑并不会重新执行,而是在下次恢复时候把已经加载出来的数据直接发送

四、参考链接

  1. kotlin协程Flow的StateFlow和SharedFlow(十二)
  2. 将 Kotlin 协程与生命周期感知型组件一起使用
  3. Jetpack之LifeCycle
  4. kotlin协程Flow的StateFlow和SharedFlow(十二)
  5. Jetpack之LifeCycle

Kotlin的协程与生命周期相关推荐

  1. Kotlin 之 协程

    初识协程,启动取消协程,Flow异步流,协程并发 目录 (一)初识协程 协程是什么? Android中协程解决了什么问题? 协程的挂起与恢复 挂起和阻塞 协程的调度器 Dispatchers 任务泄露 ...

  2. Kotlin中协程理解与实战(一)

    Kotlin中协程理解与实战(一) 什么是协程 在Android中协程用来解决什么问题 协程是: suspend -也称为挂起或暂停,用于暂停执行当前协程,并保存所有局部变量: resume -用于让 ...

  3. 【对比Java学Kotlin】协程简史

    文章目录 一.概念释义 1.1 协程定义 1.2 与线程的关系 1.3 协程简史 二.种类划分 2.1 按调用栈分类 2.2 按调度方式分类 三.异步编程 3.1 多线程 3.2 回调 3.3 Pro ...

  4. 十一、kotlin的协程(一)

    theme: Chinese-red 学习的前提 java线程需要大概知道点 协程是线程执行的任务, 协程和用户线程的区别在于, 协程背靠强大的编译器, 协程有专属于协程的调度器和一堆方便好用的函数, ...

  5. Kotlin高级协程

    Kotlin高级协程 一.前言 二.先从线程说起 三.协程的设计思想 四.协程特点:优雅的实现移步任务 五.协程基本使用 六.协程和线程相比有什么特点,如何优雅的实现异步任务 一.前言 在文章正式上干 ...

  6. Kotlin(3)-协程和操作符重载,Java程序员秋招三面蚂蚁金服

    Kotlin 文件和类不存在一对一关系 共生体 继承 修饰符 空指针问题 正文 重难点 协程 想了很久,关于协程的内容,在官网上确实有很多内容,基础知识概念,基本使用,以及 流操作,通道,异常处理,并 ...

  7. kotlin coroutines 协程教程-入门用法

    kotlin coroutines 协程教程-入门用法 Coroutine 协程,是kotlin 上的一个轻量级的线程库,对比 java 的 Executor,主要有以下特点: 更轻量级的 api 实 ...

  8. 十一、kotlin的协程 - 缓存、volatile、内存屏障和cas(四) --- 跑题篇

    本章写着写着就跑题了, 又不舍得删除, 新手看 # 协程的共享变量安全问题简单入门和## volatile 不保证原子性部分代码, 其他可以不看, 太乱, 也没用 协程的共享变量安全问题简单入门 在使 ...

  9. Kotlin Mvp 协程 Retrofit整合

    附MVP模板生成器 1.BaseModuleActivity处理loading相关逻辑 2.BaseModuleModel提供mRepositoryManager处理网络请求 3.BaseMouleP ...

最新文章

  1. MLCC噪声啸叫及对策
  2. C/S模型UDP实现
  3. 网络组Network Teaming
  4. 网友提问:当我要使用一个陌生的标准BAPI,我可以去哪里找到比较详尽的文档指导一类的资料
  5. Atom与markdown
  6. [Redux/Mobx] Redux怎样重置状态?
  7. 【hihocoder - offer编程练习赛60 B】最大顺子(双指针,思维)
  8. HttpHandler HttpModule入门篇
  9. 以软件开发周期来说明不同的测试的使用情况
  10. WP7模拟器使用技巧
  11. 缓存和数据库同步问题解决方案
  12. dnf怎么显示连接服务器失败怎么回事,登录DNF显示连接不到服务器怎么办 服务器连接失败解决方法...
  13. 【ECS】云服务器ECS是什么
  14. 教妹学Java(十四):switch 语句详解
  15. android 瀑布流 的实现
  16. OpenCV读取文件夹下的图片生成视频(mp4格式)
  17. 第12章 智能优化算法(ACO)
  18. 用python练习日语五十音图
  19. 一名职业操盘手对交易的理解
  20. 前端入门学习之 html5

热门文章

  1. AutoSar之微控制器抽象层MCAL
  2. 【Java SE】多线程
  3. 戴尔笔记本把计算机弄到桌面,戴尔笔记本电脑可不可以把程序放在桌面上-戴尔笔记本电脑怎么样...
  4. wordcount程序中,输出文件夹中为空
  5. 南京大学2021计算机考研复试线是多少,2021南京大学
  6. 免费多功能转码机器人(小程序转码机器人)
  7. Java终结者和捷安特pp_终结者致命的弱点-我会怎么对付终结者
  8. android 符号表情显示乱码,android输入框限制输入法中的表情符号
  9. ubuntu上的图片编辑工具-Pinta(品他病)
  10. 如何用服务器内存做系统盘,服务器内存扩容怎么做