Kotlin学习教程之协程Coroutine

Kotlin学习教程之协程Coroutine,第1张

概述定义Coroutine翻译为协程,Google翻译为协同程序,一般也称为轻量级线程,但需要注意的是线程是 *** 作系统里的定义概念,而协程是程序语言实现的一套异步处理的方法。

定义

Coroutine翻译为协程,Google翻译为协同程序,一般也称为轻量级线程,但需要注意的是线程是 *** 作系统里的定义概念,而协程是程序语言实现的一套异步处理的方法。

在Kotlin文档中,Coroutine定义为一个可被挂起的计算实例,下面话不多说了,来一起看看详细的介绍吧。

配置

build.gradle中dependencIEs 添加下面2行,注意coroutine目前仍处于experiment阶段,但Kotline官方保证向前兼容。

 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

<?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()函数

launch(UI) {...} -----在UIcontext下启动coroutine delay(1000) ----将当前coroutine挂起1秒

看到这里你可能会疑惑,AndroID开发中不是禁止在主线程下做延迟或者阻塞 *** 作吗?

我们回顾下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的实现,发现它会根据当前cpu的核数创建一个线程池提供给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 *** 作不会影响线程的运行,线程的状态变化对我们是透明的,我们不需要关心。

所以使用Coroutine,可以使我们更加方便得处理异步 *** 作,比如网络请求,数据存储等。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程小技巧的支持。

您可能感兴趣的文章:利用Kotlin的协程实现简单的异步加载详解Kotlin Coroutines执行异步加载示例详解 总结

以上是内存溢出为你收集整理的Kotlin学习教程之协程Coroutine全部内容,希望文章能够帮你解决Kotlin学习教程之协程Coroutine所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1142650.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存