协程Coroutines入门
添加依賴:
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0")
}
使用示例:
//方法一,使用 runBlocking 頂層函數(shù)
runBlocking {getUser(userId)
}
?
//方法二,使用 GlobalScope 單例對象
GlobalScope.launch {getUser(userId)
}
?
//方法三,自行通過 CoroutineContext 創(chuàng)建一個 CoroutineScope 對象
val coroutineScope = CoroutineScope(context)
coroutineScope.launch {getUser(userId)
}CoroutineScope(Dispatchers.IO).launch {getUser(userId)
}
launch并不是一個頂層函數(shù),不能直接用,它必須在一個對象中使用,launch 函數(shù)加上實(shí)現(xiàn)在 {} 中具體的邏輯,就構(gòu)成了一個協(xié)程。
CoroutineScope(Dispatchers.IO).launch{val image = getImage(imageId)launch(Dispatch.Main) {avatarIv.setImageBitmap(image)}
}suspend fun getImage(imageId: String):Bitmap{//...
}
withContext:
這個函數(shù)可以切換到指定的線程,并在閉包內(nèi)的邏輯執(zhí)行結(jié)束之后,自動把線程切回去繼續(xù)執(zhí)行。
CoroutineScope(Dispatchers.Main).launch {//在UI線程開始val image = withContext(Dispatchers.IO) {//切換到IO線程,并在執(zhí)行完成后切回UI線程getImage(imageId)//運(yùn)行在IO線程}avatarIv.setImageBitmap(image)//回到UI線程更新UI
}
suspend (掛起):
協(xié)程在執(zhí)行到有 suspend 標(biāo)記的函數(shù)的時候,會被suspend,也就是被掛起,而所謂的被掛起,本質(zhì)就是切換線程;
不過區(qū)別在于,掛起函數(shù)在執(zhí)行完成之后,協(xié)程會重新切回它原先的線程。
再簡單來講,在 Kotlin 中所謂的掛起,就是一個稍后會被自動切回來的線程調(diào)度操作。
這個「切回來」的動作,在 Kotlin 里叫做 resume,恢復(fù)。
掛起之后是需要恢復(fù)的,而恢復(fù)這個功能是協(xié)程的,如果你不在協(xié)程里面調(diào)用,恢復(fù)這個功能沒法實(shí)現(xiàn),所以掛起函數(shù)必須在協(xié)程或者另一個掛起函數(shù)里被調(diào)用。
什么時候需要自定義suspend函數(shù)?
原則:如果某個函數(shù)比較耗時,也就是要做等的操作,那就把它寫成 suspend 函數(shù)。
耗時操作一般分為兩類:I/O 操作和 CPU 計算工作。比如文件的讀寫、網(wǎng)絡(luò)交互、圖片的模糊處理等。另外就是邏輯中有等待操作,比如delay(5) ,這種也是 suspend 函數(shù)的應(yīng)用場景。
總結(jié):
1.協(xié)程就是切線程;
2.掛起就是可以自動切回來的切線程;
3.掛起的非阻塞式指的是它能用看起來阻塞的代碼寫出非阻塞的操作。
總結(jié)
以上是生活随笔為你收集整理的协程Coroutines入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EventBus的粘性事件原理
- 下一篇: 端口号被占用怎么解决