Kotlin協程基礎篇

什麼是協程

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 協程到底運行在哪個線程裏

初學,歡迎批評指正!!
喵印~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章