Android中使用kotlin协程

  • Post author:
  • Post category:其他


Android 中使用kotlin 协程 首先要在gradle 中引入

implementation “org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2”

implementation “org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2”

Android 中kotlin 使用协程 个人认为其实是对java 代码中线程池的一种封装,简单了开发者使用,和对线程的管理.简单用法如下

fun launch() {

        GlobalScope.launch {
            delay(100)
            println("这个是一个方法A ${Thread.currentThread().id}")
        }

        GlobalScope.launch {
            delay(50)
            println("这个是方法B ${Thread.currentThread().id}")
        }

        println("这个是方法c ${Thread.currentThread().id}")

    }

GlobalScope.launch 是一个代码块需要携程执行的代码卸载代码块中.

结果是

2021-09-17 11:20:55.100 3333-3333/com.autohome.learnkotlin I/test: 这个是方法c 2

2021-09-17 11:20:55.156 3333-3410/com.autohome.learnkotlin I/test: 这个是方法B 35810

2021-09-17 11:20:55.206 3333-3410/com.autohome.learnkotlin I/test: 这个是一个方法A 35810

首先执行的是打印C 其次 执行协程 方法 并不能保证 协程的执行顺序

fun launchB() {
        runBlocking {

            val a = GlobalScope.async {
                delay(100)
                Log.i(TAG, "a: ${Thread.currentThread().id}")
                return@async 100
            }

            val b = GlobalScope.async {
                delay(200)
                Log.i(TAG, "b: ${Thread.currentThread().id}")
                return@async 200
            }

            val c = a.await() + b.await();

            Log.i(TAG, "c:$c ${Thread.currentThread().id}")
        }
    }

运行结果

2021-09-17 11:24:31.038 3600-3660/com.autohome.learnkotlin I/test: a: 35825

2021-09-17 11:24:31.137 3600-3660/com.autohome.learnkotlin I/test: b: 35825

2021-09-17 11:24:31.137 3600-3600/com.autohome.learnkotlin I/test: c:300 2

async 同样是开启协程 和launch 类似 返回的是Deferred 是job 的子类

通过和await 搭配使用 可以达到  a b 运行完 执行c 但是耗时 并不是 a b 运行时间的和, 而是 ab同事执行, c 等待 ab 执行完之后再运行获取结果

 fun launchC() {
        runBlocking {
            var c =GlobalScope.launch {
                delay(150)
                Log.i(TAG, "c: ")
            }
            var a = GlobalScope.launch {
                delay(100)
                Log.i(TAG, "a: ")
            }

            var b = GlobalScope.launch {
                delay(200)
                Log.i(TAG, "b: ")
            }

            a.join()
            Log.i(TAG, "ssss: ")
        }

        Log.i(TAG, "launchC: ")
    }

join 用法   当前协程加入到父线程当中 结果就是 当a执行完成之后才会执行打印launchC

2021-09-17 13:28:58.470 7119-7309/com.autohome.learnkotlin I/test: a:

2021-09-17 13:28:58.471 7119-7119/com.autohome.learnkotlin I/test: ssss:

2021-09-17 13:28:58.472 7119-7119/com.autohome.learnkotlin I/test: launchC:

2021-09-17 13:28:58.519 7119-7309/com.autohome.learnkotlin I/test: c:

2021-09-17 13:28:58.571 7119-7309/com.autohome.learnkotlin I/test: b:



版权声明:本文为qq6696009原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。