什麼是協程
kotlin中的線程框架,是對線程的上層封裝,可同步代碼實現異步操作。
什麼時候用
1.切換線程或者指定線程
2.併發邏輯處理
如何啓動協程
1.launch函數
var job = GlobalScope.launch() {
Log.d("tina=====>", Thread.currentThread().name)//結果:DefaultDispatcher-workver-1
getData();
}
實驗結果launch默認是在工作線程的,所以不會阻塞線程
2.runBlocking,線程切到協程的時候用
runBlocking {
Log.d("tina=====>", Thread.currentThread().name)//結果:main
getData();
}
實驗結果runBlocking工作在主線程,可以更新UI
3.async函數,相比於landch,它是帶返回值的
runBlocking {
var data: Deferred<String> = GlobalScope.async {
"eeeee"
}
log("data是啥${data.await()}")
}
如何線程切換 Dispatchers
種類:
Dispatchers.Default 共享後臺線程池裏的線程
Dispatchers.Main Android主線程
Dispatchers.IO 共享後臺線程池裏的線程
Dispatchers.Unconfined 不限制,使用父Coroutine的現場
newSingleThreadContext 使用新的線程
var job = GlobalScope.launch() {
var data = getData()
withContext(Dispatchers.Main) {//切換到主線程
main_tv_back.text = data
}
}
suspend fun getData(): String {
delay(5000)
return "text"
}
如果在主線程調用suspend掛起函數,還是推薦將切換到io或者工作線程的操作寫在suspend函數中,畢竟整潔一點哈哈哈
補充一句,上面getData()掛起函數,之所以沒有切線程,是因爲launch不會阻塞線程,所以認爲就不用切
suspend fun getData(): String {
withContext(Dispatchers.IO){
delay(5000)
}
return "text"
}
suspend函數
掛起函數,暫時理解成一種標誌吧,反編譯發現有一個回調的用的參數,可以實現線程切回來的操作
非阻塞式掛起
以非阻塞的形式執行阻塞式的代碼
掛起
就是切線程,由當前線程掛起,當前線性繼續執行任務,被掛起的協程去另一個線程執行任務(看你切到哪個線程了),執行完還可以再切回來(也可以不切回來)
資料參考
在 Android 開發中使用 Kotlin 協程 (一) -- 初識 Kotlin 協程
Kotlin 協程到底運行在哪個線程裏
初學,歡迎批評指正!!
喵印~~~