发起协程
使用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
}