Kotlin协程

发起协程

使用launch runBlocking async
使用的同时也可以指定协程运行的线程runBlocking默认运行在当前线程

        val scopeIO = CoroutineScope(Job() + Dispatchers.IO)

        scopeIO.launch {
            Log.e(TAG, "scopeIO thread name: ${Thread.currentThread().name}")
        }
        GlobalScope.launch {
            Log.e(TAG, "GlobalScope thread name: ${Thread.currentThread().name}")
        }
        runBlocking {
            Log.e(TAG, "runBlocking thread name: ${Thread.currentThread().name}")
        }
        runBlocking(Dispatchers.IO) {
            Log.e(TAG, "runBlocking Dispatchers.IO thread name: ${Thread.currentThread().name}")
        }
        val deferredData = GlobalScope.async {
            delay(1000) // 模拟网络延迟
            "数据内容"
        }

async附带返回信息的功能,

    private suspend fun fetchData(): String {
        // 假设这是一个异步操作,返回一个Deferred<String>
        val deferredData = GlobalScope.async {
            delay(1000) // 模拟网络延迟
            "数据内容"
        }
        return deferredData.await() // 在这里等待异步操作完成
    }

调用suspend修饰的函数的时候注意事项

需要在协程代码块中调用, 比如launch runBlocking
需要suspend修饰的关键字有await withContext, 举例

    private suspend fun getUserInfo(second: Int): String {
        withContext(Dispatchers.Default) {
            delay(1000)
            val subSecond = second - 1;
            delaySecond(subSecond)
        }
        return "User"
    }

    private fun delaySecond(i: Int) {
        Thread.sleep(i.toLong() * 1000)
    }

launch withContext async await runBlocking 的区别

runBlocking和await和withContext是阻塞式的, 尽量不在主线程调用, 其他是非阻塞式的

如果没有await只有async也能执行成功

launch启动一个新的协程, withContext只能在现有的协程使用 所以withContext如果是直接在方法中需要方法使用suspend修饰方法

协程中代码块的灵活使用

Kotlin本身提供各种代码块的使用方式, 协程的代码也属于代码块
下面例子是使用withContext修饰方法的的代码块

    private suspend fun testCodeBlock(): String = withContext(Dispatchers.IO) {
        val task1 = withContext(Dispatchers.IO) {
            delay(2000)
            Log.e(TAG, "testCodeBlock withContext thread name: ${Thread.currentThread().name}")
            "one"  //返回结果赋值给task1
        }
        return@withContext task1
    }
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值