一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Android - Kotlin學習教程之協程Coroutine

Kotlin學習教程之協程Coroutine

2022-02-22 15:20wenson123 Android

這篇文章主要給大家介紹了關于Kotlin學習教程之協程Coroutine的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

定義

Coroutine翻譯為協程,Google翻譯為協同程序,一般也稱為輕量級線程,但需要注意的是線程是操作系統里的定義概念,而協程是程序語言實現的一套異步處理的方法。

在Kotlin文檔中,Coroutine定義為一個可被掛起的計算實例,下面話不多說了,來一起看看詳細的介紹吧。

配置

build.gradle中dependencies 添加下面2行,注意coroutine目前仍處于experiment階段,但Kotline官方保證向前兼容。

?
1
2
3
4
dependencies {
 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:0.22.5'
 implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:0.19.3"
}

實例

我們看一個簡單Android示例:

activity_coroutine.xml

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context=".coroutine.CoroutineActivity">
 
 <TextView
  android:id="@+id/tvHello"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content" />
</android.support.constraint.ConstraintLayout>

CoroutineActivity.kt

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class CoroutineActivity : AppCompatActivity() {
 override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_coroutine)
  setup()
 }
 
 fun setup() {
  launch(UI) { // launch coroutine in UI context
   for (i in 10 downTo 1) { // countdown from 10 to 1
    tvHello.text = "Countdown $i ..." // update text
    delay(1000) // wait half a second
   }
   tvHello.text = "Done!"
  }
 }
}

運行程序 tvHello從10倒計時顯示到1,最后顯示"Done!"

代碼分析:

我們重點分析setup()函數

  • launch(UI) {...} -----在UIcontext下啟動coroutine
  • delay(1000) ----將當前coroutine掛起1秒

看到這里你可能會疑惑,Android開發中不是禁止在主線程下做延遲或者阻塞操作嗎?

我們回顧下Coroutine的定義:一個可被掛起的計算實例。

Coroutine不是線程,所以掛起Coroutine不會影響當前線程的運行。

取消Coroutine運行

我們修改下上面的代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class CoroutineActivity : AppCompatActivity() {
 lateinit var job:Job
 override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_coroutine)
  setup()
 }
 
 fun setup() {
  job = launch(CommonPool) { // launch coroutine in UI context
   for (i in 10 downTo 1) { // countdown from 10 to 1
    tvHello.text = "Countdown $i ..." // update text
    delay(1000) // wait half a second
   }
   tvHello.text = "Done!"
  }
 }
 
 override fun onPause() {
  super.onPause()
  job.cancel()
 }
}

重點是 launch(UI)返回給一個job實例,通過job.cancel()取消coroutine。

Coroutine和thread關系

我們再分析下

?
1
launch(UI)

這行代碼是指將coroutine指派在UI線程上運行

當我們運行一段cpu耗時操作時,則需要將coroutine指定在非UI線程上。

我們寫成:

?
1
launch(){...}

這行代碼等價于:

?
1
launch(CommonPool){...}

我們分析下CommonPool的實現,發現它會根據當前cpu的核數創建一個線程池提供給Coroutine使用。

?
1
2
3
4
5
6
7
8
private fun createPlainPool(): ExecutorService {
 val threadId = AtomicInteger()
 return Executors.newFixedThreadPool(defaultParallelism()) {
  Thread(it, "CommonPool-worker-${threadId.incrementAndGet()}").apply { isDaemon = true }
 }
}
 
private fun defaultParallelism() = (Runtime.getRuntime().availableProcessors() - 1).coerceAtLeast(1)

總結:

通過上面的分析,我們理解了Coroutine是一個運行在線程上的可被掛起的計算單元實例,對Coroutine的delay,cancel操作不會影響線程的運行,線程的狀態變化對我們是透明的,我們不需要關心。

所以使用Coroutine,可以使我們更加方便得處理異步操作,比如網絡請求,數據存儲等。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:https://www.jianshu.com/p/0ee48f71edbe

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲欧美日韩高清 | 哇嘎在线精品视频在线观看 | 视频一区二区三区欧美日韩 | 歪歪私人影院成人毛片 | 国产成人99久久亚洲综合精品 | 成人人免费夜夜视频观看 | 毛片在线免费视频 | 四虎影院永久网址 | 亚洲天堂视频在线观看 | 黑人与欧洲女子性大战 | 欧美日韩一区二区三区在线观看 | 国产中文在线 | 精新精新国产自在现拍 | chinese圣水黄金调教 | 亚洲日本免费 | 12345国产精品高清在线 | 亚洲成年网站在线观看 | 操闺蜜 | 爱情岛论坛亚洲永久入口口 | 干操视频 | 欧美xxoo做爰猛烈视频 | 日韩欧美一区二区三区中文精品 | 亚洲444777KKK在线观看 | 美女撒尿毛片免费看 | 欧美日韩精品免费一区二区三区 | 羞羞一区二区三区四区片 | 国产成人精品免费久久久久 | 国产综合成人久久大片91 | 欧美一级二级片 | 国产特级| 美女岳肉太深了使劲 | 啊用力好大粗黑人小说 | 惩罚美女妲己的尤老师 | 国产欧美一区二区精品久久久 | 美女用屁股把人吞进肚子 | 国产资源在线视频 | 皇上撞着太子妃的秘密小说 | 91国语精品自产拍在线观看一 | 国产rpg迷雾之风冷狐破解 | 思思91精品国产综合在线 | 国产成人精品免费大全 |