日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

协程Coroutines入门

發布時間:2023/11/28 生活经验 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 协程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入门的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。