Kotlin攜程學習筆記

協程是什么?

進程、線程,在開發中使用最多的就是線程,比如主線程、子線程,而且操作系統里最小可操作的單元就是線程,那協程又是什么?協程是比線程更小的單位,但并不是說在操作系統里最小可操作單元就從線程變成了協程,而是協程依然運行在線程上,協程是在語言上實現的比線程更小的單位。

那么你可能有疑問,既然協程還是運行在線程上,那直接使用線程不就好了嗎?但問題是往往我們用不好線程,首先創建一個線程的成本很高,在 Android 中創建一個線程,大約要消耗 1M 的內存,而且,如果使用線程池,線程間數據的同步也是一個非常麻煩復雜的事情,所以就有了協程:

可以看作是輕量級線程,創建一個協程的成本很低

可以輕松的掛起和恢復操作

支持阻塞線程的協程和不阻塞線程的協程

可以更好的實現異步和并發

如果簡單來理解 Kotlin 協程的話,就是封裝好的線程池

Kotlin協程庫:Kotlin.coroutines

實現協程的庫是 Kotlin.coroutines,點擊查看Kotlin.coroutines在 Github 上的源碼。

Kotlin 是一門支持 多平臺的語言,所以 Kotlin.coroutines 也是支持多平臺的,包括:

Kotlin/JS

Kotlin/Native 包括 PC 和 Android

我們使用 Kotlin.coroutines 的 Android 版本。

給 Android 工程添加 Kotlin 協程庫

suspend 方法

在前面介紹協程的代碼里,有個不起眼的函數:

suspendfunfetchData():String{

delay(2000)return"content"

}

suspend方法是協程里的特有方法。

suspend 方法的定義

suspend方法的聲明很簡單,只需在方法 或 Lambda 定義前面加suspend關鍵字即可。

suspend 方法的使用限制

suspend 方法使用由限制,只能有兩個地方允許使用suspend方法:

在協程內部使用

在另一個 suspend 方法里使用

如果你在一個普通方法內存使用 suspend 方法,是會報語法錯誤的。

suspend 方法的功能

suspend 方法能夠使協程執行暫停,等執行完畢后在返回結果,同時不會阻塞線程。

是不是很神奇,只暫停協程,但不阻塞線程。

而且暫停協程里方法的執行,直到方法返回結果,這樣也不用寫 Callback 來取結果,可以使用同步的方式來寫異步代碼。

Coroutine context 與 Coroutine dispatchers

想要使用協程,還有兩個重要的元素:

Coroutine context:協程上下文

Coroutine dispatchers :協程調度

Coroutine context:協程上下文

協程上下文里是各種元素的集合。具體的之后的文章在講。

Coroutine dispatchers :協程調度

我們已經知道協程是運行在線程上的,我們獲取數據后要更新 UI ,但是在 Android 里更新 UI 只能在主線程,所以我們要在子線程里獲取數據,然后在主線程里更新 UI。這就需要改變協程的運行線程,這就是 Coroutine dispatchers 的功能了。

Coroutine dispatchers 可以指定協程運行在 Android 的哪個線程里。

我們先看下 dispatchers 有哪些種類:


var job = GlobalScope.launch(Dispatchers.Main) {

? ? ? ? var content = fetchData()

? ? ? ? Log.d("Coroutine",content)

? ? }

GlobalScope.launch 后面的Dispatchers.Main就是指定協程在 Android 主線程里運行。

那么,如何切換線程呢?如下:

GlobalScope.launch(Dispatchers.IO) {

? ? ...

? ? withContext(Dispatchers.Main) {

? ? ? ? ...

? ? }

}

使用withContext切換協程,上面的例子就是先在 IO 線程里執行,然后切換到主線程。

Android 開發中使用 協程

講完協程的基本用法,你還是不知道改如何用到自己的代碼里,這里給出一個最基本的用法,后續的使用方法會不斷補充。

首先 MainActivity 要 實現CoroutineScope這個接口,CoroutineScope的實現教由代理類MainScope,

class MainActivity : AppCompatActivity(),CoroutineScope by MainScope()


class MainActivity : AppCompatActivity(),CoroutineScope by MainScope() {


? ? override fun onCreate(savedInstanceState: Bundle?) {

? ? ? ? super.onCreate(savedInstanceState)

? ? ? ? setContentView(R.layout.activity_main)

? ? ? ? setSupportActionBar(toolbar)

? ? ? ? //加載并顯示數據

? ? ? ? loadDataAndShow()

? ? }

? ? fun loadDataAndShow(){

? ? ? ? GlobalScope.launch(Dispatchers.IO) {

? ? ? ? ? ? //IO 線程里拉取數據

? ? ? ? ? ? var result = fetchData()

? ? ? ? ? ? withContext(Dispatchers.Main){

? ? ? ? ? ? ? ? //主線程里更新 UI

? ? ? ? ? ? ? ? text.setText(result)

? ? ? ? ? ? }

? ? ? ? }

? ? }

? ? suspend fun fetchData():String{

? ? ? ? delay(2000)

? ? ? ? return "content"

? ? }

? ? override fun onDestroy() {

? ? ? ? super.onDestroy()

? ? ? ? //取消掉所有協程內容

? ? ? ? cancel()

? ? }

}

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容