美文网首页Android
Kotlin之协程(一)初识

Kotlin之协程(一)初识

作者: MakerGaoGao | 来源:发表于2021-09-16 14:24 被阅读0次

    简介

    介绍

        协程是一种并发设计模式,您可以在 Android 平台上使用它来简化异步执行的代码。
    简单来说就是执行异步任务。
    

    参考文档

    1. 谷歌开发者
    2. Kotlin文档

    文章目录

    Kotlin之协程(一)初识
    Kotlin之协程(二)取消

    优点

    1. 轻量:您可以在单个线程上运行多个协程,因为协程支持挂起,不会使正在运行协程的线程阻塞。挂起比阻塞节省内存,且支持多个并行操作。
    2. 内存泄漏更少:使用结构化并发机制在一个作用域内执行多项操作。
    3. 内置取消支持:取消操作会自动在运行中的整个协程层次结构内传播。
    4. Jetpack 集成:许多 Jetpack 库都包含提供全面协程支持的扩展。某些库还提供自己的协程作用域,可供您用于结构化并发。

    协程之HelloWorld实现

    依赖引入

       implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
       implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0'
    

    代码实现

    GlobalScope.launch {
        delay(1000)
        Log.d(Constants.TAG,"World")
    }
    Log.d(Constants.TAG,"Hello")
    

    效果

    先输出Hello,协程延迟一秒输出World,打印日志如下:

    2021-08-26 13:50:00.207 26316-26316/demo.demo.democoroutines D/Coroutines: Hello
    2021-08-26 13:50:01.230 26316-26754/demo.demo.democoroutines D/Coroutines: World
    

    协程之结构化的并发

        结构化并发,听起来感觉不是太好理解,其实主要是为了实现对协程的管理。如果我们任意地
        去启动协程而不做管理会出现如我们不需要了,但是我们没有引用与取消,协程还在运行等
        诸如此类的问题。结构化并发主要是通过创建顶级协程进行协程任务的统一管理,当然这属
        于个人通俗的理解,如有问题或者有什么其他的看法,欢迎指出与讨论。
    

    代码实现

    主要是通过 runBlocking等协程构建器将函数转换为协程,方法的调用和常规调用一直

       private fun test()= runBlocking {
    
          val job = GlobalScope.launch {
              repeat(100){
                  delay(1000)
                  Log.d(Constants.TAG,"协程打印:$it")
              }
          }
            delay(5*1000)
            job.cancel()
    
        }
    

    协程之取消

    进行循环一百次打印(每次延迟1s),在5s之后取消。

    代码实现
    private fun test()= runBlocking {
          val job = GlobalScope.launch {
              repeat(100){
                  delay(1000)
                  Log.d(Constants.TAG,"协程打印:$it")
              }
          }
            delay(5*1000)
            job.cancel()
        }
    
    效果

    可以看到打印了4次,到第5次打印的时候取消了任务不能再进行打印

    2021-08-26 14:20:50.853 29331-29384/demo.demo.democoroutines D/Coroutines: 协程打印:0
    2021-08-26 14:20:51.855 29331-29384/demo.demo.democoroutines D/Coroutines: 协程打印:1
    2021-08-26 14:20:52.858 29331-29384/demo.demo.democoroutines D/Coroutines: 协程打印:2
    2021-08-26 14:20:53.865 29331-29384/demo.demo.democoroutines D/Coroutines: 协程打印:3
    

    协程之Join

    join函数作用

    主要是实现占用执行,执行完毕之后再进行其他协程任务的执行
    

    下面对比两种效果看下join的作用

    代码实现1
    private fun test()= runBlocking {
            
            GlobalScope.launch {
                delay(500)
                Log.d(Constants.TAG,"job-test")
            }
    
            GlobalScope.launch {
                delay(1000)
                Log.d(Constants.TAG,"World")
            }
            Log.d(Constants.TAG,"Hello")
    
        }
    
    效果1

    打印日志如下(可以看出job-test穿插在helloworld中间执行):

    2021-08-26 14:06:08.607 27747-27747/demo.demo.democoroutines D/Coroutines: Hello
    2021-08-26 14:06:09.133 27747-27807/demo.demo.democoroutines D/Coroutines: job-test
    2021-08-26 14:06:10.578 27747-27807/demo.demo.democoroutines D/Coroutines: World
    
    代码实现2
     private fun test()= runBlocking {
            
            val job = GlobalScope.launch {
                delay(500)
                Log.d(Constants.TAG,"job-test")
            }
            job.join()
    
            GlobalScope.launch {
                delay(1000)
                Log.d(Constants.TAG,"World")
            }
            Log.d(Constants.TAG,"Hello")
    
        }
    
    效果

    打印日志如下(可以看出helloworld在job-test执行完毕之后才进行执行):

    2021-08-26 14:16:01.914 28884-28927/demo.demo.democoroutines D/Coroutines: job-test
    2021-08-26 14:16:01.916 28884-28884/demo.demo.democoroutines D/Coroutines: Hello
    2021-08-26 14:16:02.919 28884-28927/demo.demo.democoroutines D/Coroutines: World
    

    总结

        本文主要对协程的概念、优点及使用做了相关的介绍,实现了简单的协程编程,如HelloWorld
    、结构化编程、取消、Join等,记录自己的学习与理解的相关内容,当然希望也能对大家有
    那么一点点的帮助或者启发,我就很开心了。当然了本人也是在学习与理解的过程中记录与理解
    难免有一定的认知局限性,如果发现有什么问题,欢迎指正,谢谢。

    相关文章

      网友评论

        本文标题:Kotlin之协程(一)初识

        本文链接:https://www.haomeiwen.com/subject/urvrgltx.html