簡介
介紹
協程是一種并發(fā)設計模式,您可以在 Android 平臺上使用它來簡化異步執(zhí)行的代碼。
簡單來說就是執(zhí)行異步任務。
參考文檔
文章目錄
優(yōu)點
- 輕量:您可以在單個線程上運行多個協程衣陶,因為協程支持掛起扔傅,不會使正在運行協程的線程阻塞杨箭。掛起比阻塞節(jié)省內存储藐,且支持多個并行操作。
- 內存泄漏更少:使用結構化并發(fā)機制在一個作用域內執(zhí)行多項操作吨铸。
- 內置取消支持:取消操作會自動在運行中的整個協程層次結構內傳播。
- Jetpack 集成:許多 Jetpack 庫都包含提供全面協程支持的擴展祖秒。某些庫還提供自己的協程作用域诞吱,可供您用于結構化并發(fā)。
協程之HelloWorld實現
依賴引入
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0'
代碼實現
GlobalScope.launch {
delay(1000)
Log.d(Constants.TAG,"World")
}
Log.d(Constants.TAG,"Hello")
效果
先輸出Hello竭缝,協程延遲一秒輸出World房维,打印日志如下:
2021-08-26 13:50:00.207 26316-26316/demo.demo.democoroutines D/Coroutines: Hello
2021-08-26 13:50:01.230 26316-26754/demo.demo.democoroutines D/Coroutines: World
協程之結構化的并發(fā)
結構化并發(fā),聽起來感覺不是太好理解抬纸,其實主要是為了實現對協程的管理咙俩。如果我們任意地
去啟動協程而不做管理會出現如我們不需要了,但是我們沒有引用與取消湿故,協程還在運行等
諸如此類的問題阿趁。結構化并發(fā)主要是通過創(chuàng)建頂級協程進行協程任務的統一管理,當然這屬
于個人通俗的理解坛猪,如有問題或者有什么其他的看法脖阵,歡迎指出與討論。
代碼實現
主要是通過 runBlocking等協程構建器將函數轉換為協程墅茉,方法的調用和常規(guī)調用一直
private fun test()= runBlocking {
val job = GlobalScope.launch {
repeat(100){
delay(1000)
Log.d(Constants.TAG,"協程打用:$it")
}
}
delay(5*1000)
job.cancel()
}
協程之取消
進行循環(huán)一百次打印(每次延遲1s)躁锁,在5s之后取消纷铣。
代碼實現
private fun test()= runBlocking {
val job = GlobalScope.launch {
repeat(100){
delay(1000)
Log.d(Constants.TAG,"協程打印:$it")
}
}
delay(5*1000)
job.cancel()
}
效果
可以看到打印了4次战转,到第5次打印的時候取消了任務不能再進行打印
2021-08-26 14:20:50.853 29331-29384/demo.demo.democoroutines D/Coroutines: 協程打铀蚜ⅰ:0
2021-08-26 14:20:51.855 29331-29384/demo.demo.democoroutines D/Coroutines: 協程打印:1
2021-08-26 14:20:52.858 29331-29384/demo.demo.democoroutines D/Coroutines: 協程打踊毖怼:2
2021-08-26 14:20:53.865 29331-29384/demo.demo.democoroutines D/Coroutines: 協程打幼挠弧:3
協程之Join
join函數作用
主要是實現占用執(zhí)行忧设,執(zhí)行完畢之后再進行其他協程任務的執(zhí)行
下面對比兩種效果看下join的作用
代碼實現1
private fun test()= runBlocking {
GlobalScope.launch {
delay(500)
Log.d(Constants.TAG,"job-test")
}
GlobalScope.launch {
delay(1000)
Log.d(Constants.TAG,"World")
}
Log.d(Constants.TAG,"Hello")
}
效果1
打印日志如下(可以看出job-test穿插在helloworld中間執(zhí)行):
2021-08-26 14:06:08.607 27747-27747/demo.demo.democoroutines D/Coroutines: Hello
2021-08-26 14:06:09.133 27747-27807/demo.demo.democoroutines D/Coroutines: job-test
2021-08-26 14:06:10.578 27747-27807/demo.demo.democoroutines D/Coroutines: World
代碼實現2
private fun test()= runBlocking {
val job = GlobalScope.launch {
delay(500)
Log.d(Constants.TAG,"job-test")
}
job.join()
GlobalScope.launch {
delay(1000)
Log.d(Constants.TAG,"World")
}
Log.d(Constants.TAG,"Hello")
}
效果
打印日志如下(可以看出helloworld在job-test執(zhí)行完畢之后才進行執(zhí)行):
2021-08-26 14:16:01.914 28884-28927/demo.demo.democoroutines D/Coroutines: job-test
2021-08-26 14:16:01.916 28884-28884/demo.demo.democoroutines D/Coroutines: Hello
2021-08-26 14:16:02.919 28884-28927/demo.demo.democoroutines D/Coroutines: World
總結
本文主要對協程的概念、優(yōu)點及使用做了相關的介紹颠通,實現了簡單的協程編程址晕,如HelloWorld
、結構化編程顿锰、取消谨垃、Join等,記錄自己的學習與理解的相關內容硼控,當然希望也能對大家有
那么一點點的幫助或者啟發(fā)刘陶,我就很開心了。當然了本人也是在學習與理解的過程中記錄與理解
難免有一定的認知局限性牢撼,如果發(fā)現有什么問題匙隔,歡迎指正,謝謝熏版。