Android中使用kotlin协程

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: 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值