withContext
kotlin 中 GlobalScope 類提供了幾個創建協程的構造函數:
- launch: 創建協程
- async : 創建帶返回值的協程,返回的是 Deferred 類
- withContext:不創建新的協程,指定協程上運行代碼塊
- runBlocking:不是 GlobalScope 的 API,可以獨立使用,區別是 runBlocking 裏面的 delay 會阻塞線程,而 launch 創建的不會
withContextt這個函數主要可以切換到指定的線程,並在閉包內的邏輯執行結束之後,自動把線程切回去繼續執行:
coroutineScope.launch(Dispatchers.Main) { // 在 UI 線程開始
val image = withContext(Dispatchers.IO) { // 切換到 IO 線程,並在執行完成後切回 UI 線程
getImage(imageId) // 將會運行在 IO 線程
}
avatarIv.setImageBitmap(image) // 回到 UI 線程更新 UI
}