Kotlin入门(三)使用协程

开启一个协程

fun main() {
          
   
    GlobalScope.launch {
          
    
        println("开启了一个协程")
    }
}

创建多个协程

使用launch

runBlocking {
          
    
        launch {
          
    
            println("创建第一个协程")
        }
        launch {
          
    
            println("创建第二个协程")
        }
    }

声明挂起函数

suspend

suspend fun printMessage() {
          
   
        println("声明一个挂起函数")
    }

coroutineScope

coroutineScope函数是一个挂起函数,它会继承外部协程的作用域并创建一个子作用域,它可以保证其作用域内的所有代码和子协程全部执行完之前,一直阻塞当前协程。

suspend fun printMessage()  = coroutineScope{
          
   
        println("声明一个挂起函数")
    }

取消协程

val job = GlobalScope.launch {
          
    
        println("取消协程")
    }
    job.cancel()

比较常用的写法

val job = Job()
    val scope = CoroutineScope(job)
    scope.launch {
          
    
        println("统一管理协程")
    }
    job.cancel()

创建一个协程并获取它的执行结果

runBlocking {
          
    
        val result = async {
          
    
            5+5
        }.await()
        println(result)
    }

async并行写法

runBlocking {
          
   
        val deferred1 = async {
          
   

        }
        val deferred2 = async {
          
   

        }
        println("结果是:${
            
     deferred1.await() + deferred2.await()}")
    }

withContext

runBlocking {
          
   
        val result = withContext(Dispatchers.IO) {
          
   
            5+5
        }
        println(result)
    }

使用协程简化回调的写法

通常的网络请求写法

HttpUtil.sendHttpRequest(address, object: HttpCallbackListener {
          
   
	
	override fun onFinish(response: String) {
          
   
		//拿到数据
	}
	
	override fun onError(e: Exception) {
          
   
		//异常处理
	}
})

suspendCoroutine函数

"suspendCoroutine函数必须在协程作用域,或在挂起函数中才能调用,
它接收一个Lambda表达式,主要作用是将当前协程立即挂起,
然后在一个普通的线程中执行Lambda表达式中的代码。"

进行回调优化,首先定义一个request函数

suspend fun request(address: String): String {
          
   
        return suspendCoroutine {
          
    continuation ->
            HttpUtil.sendHttpRequest(address, object : HttpCallbackListener {
          
   
                override fun onFinish(response: String) {
          
   
                    continuation.resume(response)//恢复被挂起的协程,response成为suspendCoroutine函数的返回值
                }

                override fun onError(e: Exception) {
          
   
                    continuation.resumeWithException(e)
                }
            })
        }
    }

然后请求

suspend fun getBaiduResponse() {
          
   
        try {
          
   
            val response = request("https://www.baidu.com")
        } catch (e: Exception) {
          
   
            //异常处理
        }
    }
经验分享 程序员 微信小程序 职场和发展