麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發(fā) > 綜合 > 正文

Kotlin學習教程之協(xié)程Coroutine

2024-07-21 23:03:45
字體:
來源:轉載
供稿:網友

定義

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

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

配置

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

 dependencies {   implementation 'org.jetbrains.kotlin/306652.html">kotlin/289324.html">kotlinx:kotlinx-coroutines-core:0.22.5'    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:0.19.3"  }

實例

我們看一個簡單Android示例:

activity_coroutine.xml

<?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

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()函數(shù)

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

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

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

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

取消Coroutine運行

我們修改下上面的代碼:

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關系

我們再分析下

launch(UI)

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

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

我們寫成:

launch(){...}

這行代碼等價于:

launch(CommonPool){...}

我們分析下CommonPool的實現(xiàn),發(fā)現(xiàn)它會根據(jù)當前cpu的核數(shù)創(chuàng)建一個線程池提供給Coroutine使用。

 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操作不會影響線程的運行,線程的狀態(tài)變化對我們是透明的,我們不需要關心。

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

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


注:相關教程知識閱讀請移步到kotlin教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 久久久久久久久久综合 | 亚洲 91 | 精品国产一区二区三区久久久蜜月 | 免费在线观看国产精品 | 羞羞答答影院 | 狠狠干91 | 欧美女同hd | 亚洲自拍第二页 | 97久久日一线二线三线 | chinese-xvideos | 免费在线观看成人av | av影片在线观看 | 国产在线免费 | 久久影城 | 国产午夜精品一区二区三区四区 | 免费黄色大片在线观看 | 91av资源在线 | 日韩黄色片在线观看 | 久久精品视频一区 | 久久久久久69 | 国产资源在线播放 | 日韩一级片黄色 | 最新av网址在线观看 | 男女做性免费网站 | 国产精品视频专区 | 亚洲乱操 | 精品国产一区二区三区久久久狼牙 | 一级大片在线观看 | 青草久久网 | 精品国产一二区 | 色就色 综合偷拍区91网 | 九九热这里只有精品8 | 亚洲精品成人av在线 | av在线浏览 | 久久久久夜色精品国产老牛91 | 一级黄色免费观看 | 中国老女人一级毛片视频 | 久久精品无码一区二区三区 | 欧美成人精品h版在线观看 国产一级淫片在线观看 | 精品一区二区三区毛片 | 色视频欧美 |