協(xié)程是什么请垛?
首先kotlin協(xié)程是kotlin的擴(kuò)展庫(kotlinx.coroutines)褪迟。
相信大家應(yīng)該都了解線程的概念寇甸,線程在Android開發(fā)中一般用來做一些復(fù)雜耗時的操作第美,避免耗時操作阻塞主線程而出現(xiàn)ANR的情況,例如IO操作就需要在新的線程中去完成时鸵。但是呢,如果一個頁面中使用的線程太多渴杆,線程間的切換是很消耗內(nèi)存資源的寥枝,我們都知道線程是由系統(tǒng)去控制調(diào)度的宪塔,所以線程使用起來比較難于控制。這個時候kotlin的協(xié)程就體現(xiàn)出它的優(yōu)勢了囊拜,kotlin協(xié)程是運行在線程之上的某筐,它的切換由程序自己來控制,無論是 CPU 的消耗還是內(nèi)存的消耗都大大降低冠跷。所以大家趕緊來擁抱kotlin協(xié)程吧^_^
Android項目中如何引入kotlin協(xié)程
在Android module中的build.gradle的dependencies中添加下圖中的依賴南誊。
kotlin協(xié)程的三種啟動方式
1.runBlocking:T? ? ?
2.launch:Job
3.async/await:Deferred
第一種啟動方式(runBlocking:T)
runBlocking? 方法用于啟動一個協(xié)程任務(wù),通常只用于啟動最外層的協(xié)程蜜托,例如線程環(huán)境切換到協(xié)程環(huán)境抄囚。
上圖是官方源碼中給出的該方法的解釋,意思就是說runBlocking啟動的協(xié)程任務(wù)會阻斷當(dāng)前線程橄务,直到該協(xié)程執(zhí)行結(jié)束幔托。
代碼示例:
執(zhí)行結(jié)果:可以清楚的看到先將協(xié)程中的任務(wù)完成才執(zhí)行主線程中的邏輯
第二種啟動方式(launch:Job)
我們最常用的用于啟動協(xié)程的方式,它最終返回一個Job類型的對象蜂挪,這個Job類型的對象實際上是一個接口重挑,它包涵了許多我們常用的方法。例如join()啟動一個協(xié)程棠涮、cancel() 取消一個協(xié)程
注??:該方式啟動的協(xié)程任務(wù)是不會阻塞線程的
代碼示例:
執(zhí)行結(jié)果:可以清楚的看到主線程沒有被阻塞
第三種啟動方式(async/await:Deferred)
1.async和await是兩個函數(shù)谬哀,這兩個函數(shù)在我們使用過程中一般都是成對出現(xiàn)的。
2.async用于啟動一個異步的協(xié)程任務(wù)严肪,await用于去得到協(xié)程任務(wù)結(jié)束時返回的結(jié)果史煎,結(jié)果是通過一個Deferred對象返回的。
代碼示例:
執(zhí)行結(jié)果:可以看到當(dāng)協(xié)程任務(wù)執(zhí)行完畢時可以通過await()拿到返回結(jié)果
補(bǔ)充
協(xié)程是可以被取消的和超時控制驳糯,可以組合被掛起的函數(shù)篇梭,協(xié)程中運行環(huán)境的指定,也就是線程的切換
以上就是kotlin中協(xié)程的簡單用法结窘,希望可以幫到大家很洋。協(xié)程具體的文檔在這里:https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md