Coroutine(協(xié)程)是什么玩意腋腮?
協(xié)程名字聽起來(lái)很玄乎勒虾,其實(shí)他是很簡(jiǎn)單的纺阔。
所謂協(xié)程,就是相互協(xié)作的程序修然。
為了做好一件事情州弟,我們的程序要相互協(xié)作钧栖!
一個(gè)協(xié)程代表著:幾段互相幫助,互相協(xié)作的代碼婆翔。
舉個(gè)簡(jiǎn)單的例子:
在Android中拯杠,我們?cè)趗i線程中做與界面相關(guān)的操作。
但我們經(jīng)常會(huì)遇到磁盤的讀寫啃奴,網(wǎng)絡(luò)的請(qǐng)求潭陪,這些繁瑣耗時(shí)的操作我們是在另外一個(gè)線程的處理,等這些操作完成后最蕾,我們?cè)侔呀Y(jié)果顯示到界面上依溯。
以上就是一種協(xié)作,總結(jié)下:
- ui線程把耗時(shí)操作的代碼塊交給其他線程來(lái)處理
- 其他線程處理處理完成后瘟则,把結(jié)果交付給ui線程顯示
其實(shí)以上的例子就是所謂的異步問(wèn)題
如何處理異步問(wèn)題黎炉?
有很多種方法:
- 開啟一起線程處理
- 利用AsyncTask
- 利用CallBack
- 利用RxJava
以上方法本質(zhì)上都是在另外一個(gè)線程處理耗時(shí)的操作,只是寫法上一個(gè)比一個(gè)先進(jìn)一點(diǎn)醋拧,人性化一點(diǎn)慷嗜。
OK,協(xié)程可以更加人性化丹壕,寫出來(lái)的代碼更加人性化一些庆械,很直觀的看出哪些代碼在互相協(xié)作,看下面的對(duì)比:
協(xié)程 vs 回調(diào)
1. 異步計(jì)算
2. 異步UI
看了上面的例子菌赖,是不是感覺:
協(xié)程中最大的特色:將異步代碼寫的干凈清晰缭乘!
協(xié)程的基本使用
-
啟用一個(gè)協(xié)程
-
啟用一個(gè)可阻塞當(dāng)下線程的協(xié)程
-
主動(dòng)去等待一個(gè)協(xié)程完成
-
重構(gòu),將代碼組織進(jìn)一個(gè)函數(shù)內(nèi)琉用,這個(gè)函數(shù)被 suspend修飾
其他:
- 協(xié)程是可以被取消的和超時(shí)控制
- 可以組合被掛起的函數(shù)
- 協(xié)程中運(yùn)行環(huán)境的指定堕绩,也就是線程的切換
具體的文檔在這里:https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md
協(xié)程的內(nèi)部是如何工作的?
以下只是簡(jiǎn)單的說(shuō)一說(shuō)邑时,來(lái)自官網(wǎng)
協(xié)程在編譯階段就完成了逛尚,它不需要虛擬機(jī)或者os的支持。
協(xié)程里面被掛起的任務(wù)是通過(guò)代碼轉(zhuǎn)換而成的刁愿。
每個(gè)可被掛起的函數(shù),被增強(qiáng)為一個(gè)狀態(tài)機(jī):這個(gè)狀態(tài)機(jī)記錄當(dāng)前函數(shù)所處環(huán)境的狀態(tài)到逊,若這個(gè)函數(shù)執(zhí)行完畢铣口,狀態(tài)機(jī)依據(jù)當(dāng)前的狀態(tài)恢復(fù)被掛起之前的環(huán)境。
建議看下我的這篇文章:同步編程 vs 異步編程
關(guān)于協(xié)程中的API
kotlin中的協(xié)程目前還處于試驗(yàn)性階段觉壶。
kotlin標(biāo)準(zhǔn)庫(kù)提供了最基本的api脑题。
想要使用一些奇技淫巧,目前有一些支持庫(kù)可供參考:
參考
文章寫的還不完善铜靶,好多地方?jīng)]有提到叔遂,后續(xù)繼續(xù)更新他炊。