Kotlin的协程与生命周期

32 篇文章 2 订阅

一、前言

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kotlin程是一种用于实现轻量级、非阻塞并发的编程框架。它允许您以顺序的方式编写异步代码,同时提供了一种简单的方式来管理和组织程的执行。 在Kotlin中,程的管理是通过CoroutineScope来实现的。CoroutineScope是一个接口,用于定义程的作用域。通过实现CoroutineScope接口,您可以在作用域内启动和管理程。 为了创建一个程作用域,您可以使用CoroutineScope的构造函数,并为其提供一个CoroutineContext。CoroutineContext是一个上下文对象,它包含了程的执行环境和其他相关信息。在程作用域中,您可以使用该上下文对象来控制程的行为。 一旦您创建了程作用域,您可以使用该作用域来启动程。通过调用CoroutineScope的launch或async函数,您可以在作用域内启动一个新的程。这些函数将返回一个Job对象,您可以使用该对象来管理和控制程的执行。 在程作用域中,您还可以使用CoroutineScope的其他函数来管理程的生命周期。例如,您可以使用cancel函数来取消作用域内的所有程,使用join函数来等待所有程的完成。 总结起来,Kotlin程的管理是通过CoroutineScope来实现的。通过实现CoroutineScope接口并使用其函数,您可以在作用域内启动和管理程的执行。使用CoroutineScope的构造函数和上下文对象,您可以控制程的行为。同时,您还可以使用其他函数来管理程的生命周期
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值