kotlin:协程底子

源码 2024-9-27 06:52:03 13 0 来自 中国
一、什么是协程?

协程:可以简单地将它明确成一种轻量级的线程协程答应我们在单线程模式下模拟多线程编程的结果,代码实行时的挂起与规复美满是由编程语言来控制的,和操纵体系无关。这种特性使得高并发步伐的运行服从得到了极大的提拔。协程让异步线程同步化,杜绝回调地狱。协程最焦点的点就是,函数或者一段步伐可以或许被挂起,稍后再在挂起的位置规复。二、Android中协程用来办理什么题目?

1、处理惩罚耗时任务:这种任务常常会壅闭主线程2、包管主线程安全:即确保安全地从主线程调用任何suspend函数三、必要添加地依赖

implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1"implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1"四、创建协程

1、runBlocking:壅闭主线程    runBlocking {    }2、GlobalScope.launch:顶级协程,不壅闭主线程    GlobalScope.launch {            }3、在协程中利用 launch 新建多个子协程(同一线程池),launch 和 launch之间是并发实行,只有在 CoroutineScope 作用域下才可以利用 launch。    GlobalScope.launch {        launch {        }        launch {        }        launch {        }    }    runBlocking {        launch {        }        launch {        }        launch {        }    }    CoroutineScope(Dispatchers.Default).launch {            }五、协程的两部分

Kotlin的协程实现分为两个条理:
* 底子办法层,标准库的协程API,重要对协程提供了概念和语义上的最基本的支持* 业务框架层,协程的上层框架支持我们可以利用底子办法层创建协程:
val continuation = suspend { // 协程体    5}.createCoroutine(object : Continuation<Int> {    override val context: CoroutineContext = EmptyCoroutineContext    override fun resumeWith(result: Result<Int>) {        println(result)    }})continuation.resume(Unit)我们知道了着实创建协程的过程,在底子办法层中也是看起来那么复杂。
六、协程的挂起与规复

通例函数基本操纵包罗:invoke(或call)和return,协程新增了suspend和resume:* suspend:也称为挂起或停息,用于停息实行当前协程,并生存全部局部变量;* resume:用于让已停息的协程从其停息处继承实行。利用suspend关键字修饰的函数叫作挂起函数。挂起函数只能在协程体内或其他挂起函数内调用。七、协程调理器

Dispatchers.Default:体现会利用一种默认低并发的线程战略,当你要实行的代码属于计算麋集型任务时,    开启过高的并发反而大概会影响任务的运行服从,此时就可以利用Dispatchers.Default。场景:数组排序,JSON数据剖析,处理惩罚差异判断。Dispatchers.IO:体现会利用一种较高并发的线程战略,当你要实行的代码大多数时间是在壅闭和等候中,    比如说实行网络哀求时,为了可以或许支持更高的并发数量,此时就可以利用Dispatchers.IO。场景:数据库、文件读写、网络处理惩罚Dispatchers.Main:则体现不会开启子线程,而是在Android 主线程中实行代码,    但是这个值只能在Android 项目中利用。场景:调用suspend函数、调用UI函数、更新LiveData八、挂起和壅闭

GlobalScope.launch(Dispatchers.Main) { // 主线程    // delay是一个非壅闭式的函数,让协程挂起,不影响别的协程运行    // 让协程挂起15秒    delay(15000) // 假设有15s的耗时操纵}以上协程已经切换到了Main线程调理器,delay 是挂起函数,可以让delay函数暂时挂起,挂起函数不会壅闭线程(主线程或别的线程),别的,协程体本身就是一个挂起函数。如果不利用协程,在主线程中,存在15秒耗时操纵,会引起ANR。比如:Thread.sleep(15000)Thread.sleep函数是真正的壅闭函数,它会让当火线程壅闭。耗时处理惩罚一样平常在异步线程来处理惩罚,异步线程不仅创建了多余的内存,而且异步线程实行完之后,必要切换线程之后才气更新UI,如果不利用协程,利用存java的方式切换线程,代码量较多,后期维护本钱较大。利用协程,可以简化代码,而且优化了并发速率。我们知道,协程体中代码是暂时被挂起的,不会引起壅闭,但是为了更好的并发,我们将耗时操纵放到Dispatchers.Default或者Dispatchers.IO调理器上处理惩罚,优化有的协程代码如下:        GlobalScope.launch(Dispatchers.Main) { // 主线程            withContext(Dispatchers.Default) { // 耗时操纵在IO中实行                // delay是一个非壅闭式的函数,让协程挂起,不影响别的协程运行                // 让协程挂起15秒                delay(15000) // 假设有15s的耗时操纵            }            // 更新UI            //。。。实行更新UI操纵。。。        }九、协程的任务走漏

当某个协程任务丢失,会导致内存、CPU、磁盘等资源浪费,以致发送一个无用的网络哀求,这种环境称为任务走漏。
为了可以或许避免协程走漏,Kotlin引入了结构化并发机制。
利用结构化并发可以做到:

  • 取消任务,当某项不再必要时取消它。
  • 追踪任务,当任务正在实行时,追踪它。
  • 发出错误信号,当协程失败时,发出错误信号表明有错误发生。
CoroutinesScope:界说协程必须指定其CoroutinesScope,它会跟踪全部协程,同样它还可以取消由它所启动的全部协程。
常用的相干API有:

  • GlobalScope,生命周期是process级别的,即使Activity或Fragment已经被烧毁,协程仍旧在实行。
          GlobalScope.launch { }
  • MainScope,在Activity中利用,可以在onDestory中取消协程。
    private val mainScope = MainScope()mainScope.launch { // 创建协程}// 在onDestroy中取消协程,防止协程走漏override fun onDestroy() {    super.onDestroy()    mainScope.cancel()}一样平常利用委托的方式取处理惩罚:界说一个基类:  abstract class ScopedActivity: AppCompatActivity(), CoroutineScope by MainScope(){      override fun onDestroy() {          super.onDestroy()          cancel()      }  }如许就可以方便的在Activity中利用协程了,而且还不消担心协程走漏,在Activity中利用时,直接launch就可以了:launch {  }
  • viewModelScope,只能在ViewModel中利用,绑定ViewModel的生命周期。
    继承 ViewModel 或 AndroidViewModel依赖:implementation"androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"viewModelScope.launch { // 创建协程}
  • lifecycleScope,只能在Activity、Fragment中利用,会绑定Activity和Fragment的生命周期。
    依赖:  implementation"androidx.lifecycle:lifecycle-runtime-ktx:2.2.0"  lifecycleScope.launch {        } 和生命周期绑定,会主动取消。
[本章完...]
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 18:19, Processed in 0.196553 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表