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