首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

协程简单上手(线程切换)

上一篇文章中我们分析了挂起函数的本质(状态机),以及查看编译器为我们生成的类里面是如何借用状态机实现的“挂起”,那么在实际coding中我们该如何使用协程呢?...}当withContext运行完成之后会自动恢复调用withContext的线程中。...协程如何测试开启协程runTest 是用于测试的协程构建器。相比于正式编码的时候使用的是launch和async。使用此构建器可封装包含协程的任何测试。...必须使用指定调度器通过TestDispatchers调度器来指定协程的运行线程,相比于正式编码使用的是Dispatchers.IO,Dispatchers.Main,Dispatchers.Default...由于多线程下的测试是不可预测的,所以正式编码中出现的withContext切换线程应换成单线程的方式因为这样将会**使得结果可预测**,所以再项目中不能使用硬编码去设置调度器Dispatchers,应该使用注入的方式如果是测试注入

39150

协程简单上手(线程切换)

theme: condensed-night-purple 上一篇文章中我们分析了挂起函数的本质(状态机),以及查看编译器为我们生成的类里面是如何借用状态机实现的“挂起”,那么在实际coding中我们该如何使用协程呢...典型的场景比如开启协程获取数据需要进行不同的线程切换: 这时候可以使用withContext withContext(Dispatchers.IO) {             // IO线程运行        ...协程如何测试 开启协程 runTest 是用于测试的协程构建器。相比于正式编码的时候使用的是launch和async。使用此构建器可封装包含协程的任何测试。...必须使用指定调度器 通过TestDispatchers调度器来指定协程的运行线程,相比于正式编码使用的是Dispatchers.IO,Dispatchers.Main,Dispatchers.Default...由于多线程下的测试是不可预测的,所以正式编码中出现的withContext切换线程应换成单线程的方式因为这样将会使得结果可预测,所以再项目中不能使用硬编码去设置调度器Dispatchers,应该使用注入的方式如果是测试注入

61520
您找到你想要的搜索结果了吗?
是的
没有找到

【Kotlin 协程】协程底层实现 ③ ( 结构化并发 | MainScope 作用域 | 取消协程作用域 | Activity 实现 CoroutineScope 协程作用域接口 )

作用域仅在 Activty 中 , 如果 Activity 被销毁 , 则 在 onDestory 生命周期函数中取消协程任务 ; viewModelScope : 该作用与仅在 ViewModel 中使用..., 与 ViewModel 生命周期绑定 ; lifecycleScope : 该作用与仅在 Activity 中使用 , 与 Activity 生命周期绑定 ; 一、MainScope 协程作用域...是协程任务调度器, 用于执行耗时操作 withContext(Dispatchers.IO){ Log.i("MainActivity", "withContext : 协程中执行耗时操作...是协程任务调度器, 用于执行耗时操作 withContext(Dispatchers.IO){ Log.i("MainActivity", "withContext...是协程任务调度器, 用于执行耗时操作 withContext(Dispatchers.IO){ Log.i("MainActivity", "withContext

1K10

在 Android 开发中使用协程 | 背景介绍

使用协程来处理协程任务 使用协程可以简化您的代码来处理类似 fetchDocs 这样的耗时任务。我们先用协程的方法来重写上面的代码,以此来讲解协程是如何处理耗时任务,从而使代码更清晰简洁的。...上述动画展示了 Kotlin 如何使用 suspend 和 resume 来代替回调 观察上图中 fetchDocs 的执行,就能明白** suspend** 是如何工作的。...接着前面的示例来讲,您可以使用调度器来重新定义 get 函数。在 get 的主体内,调用 withContext(Dispatchers.IO) 来创建一个在 IO 线程池中运行的块。...由于 withContext 本身就是一个 suspend 函数,它会使用协程来保证主线程安全。...接下来的文章中我们将继续探讨协程在 Android 中是如何使用的,感兴趣的读者请继续关注。

1.5K30

使用kotlin协程提高app性能(译)

本主题描述了如何使用Kotlin协程解决这些问题,使您能够编写更清晰,更简洁的应用程序代码。 管理长时间运行的任务 在Android上,每个应用程序都有一个主线程来处理用户界面并管理用户交互。...for `get` show(result) // Dispatchers.Main } suspend fun get(url: String) = withContext(Dispatchers.IO...Dispatchers.IO – 此调度程序已经过优化,可在主线程外执行磁盘或网络I / O. 示例包括使用Room组件,读取或写入文件以及运行任何网络操作。...继续前面的示例,您可以使用调度程序重新定义get函数。 在get的主体内部,调用withContext(Dispatchers.IO)来创建一个在IO线程池上运行的块。...要点:使用使用Dispatchers.IO或Dispatchers.Default等线程池的调度程序并不能保证该块从上到下在同一个线程上执行。

2.3K10

协程三问—快手真题

协程,kotlin中一个神奇的组件,由于使用方便任意切换被广大开发者使用,今天就来看看协程: 说说你对协程的理解 说下协程具体的使用 协程怎么取消 说说你对协程的理解 在我看来,协程和线程一样都是用来解决并发任务...kotlin中的协程其实是对线程的一种封装,或者说是一种线程框架,为了让异步任务更好更方便使用。...说下协程具体的使用 比如在一个异步任务需要回调到主线程的情况,普通线程需要通过handler切换线程然后进行UI更新等,一旦多个任务需要顺序调用,那更是很不方便,比如以下情况: //客户端顺序进行三次网络异步请求...(Dispatchers.IO){} } suspend fun ioTask2(){ withContext(Dispatchers.IO){} } suspend...fun ioTask3(){ withContext(Dispatchers.IO){} } fun updateUI1(){ } fun updateUI2

44230

Kotlin协程知识累计

withContext挂起的是内部包裹的代码块,阻塞当前运行withContext的协程。...一个withContext和一个delay都是可以实现挂起,withContext挂起时间取决于包裹的代码块运行时间,delay是直接设置挂起时间,delay挂起阻塞当前运行delay的协程,delay...协程 开始执行,时间: ${System.currentTimeMillis()}") val job1 = withContext(Dispatchers.IO) {...既然都是共享内存那和我们自己使用共享内存有什么区别呢?所以更为准确的说法是为什么我们使用发送消息的方式来同步信息,而不是多个线程或者协程直接共享内存?...1.首先,使用发送消息来同步信息相比于直接使用共享内存和互斥锁是一种更高级的抽象,使用更高级的抽象能够为我们在程序设计上提供更好的封装,让程序的逻辑更加清晰; 2.其次,消息发送在解耦方面与共享内存相比也有一定优势

14210

Android协程的7个必要知识点

协程作用域: 理解协程作用域的概念,如何管理多个协程的生命周期和范围。 并发与顺序性: 学会使用协程来处理并发任务和顺序性操作,以及如何组合多个协程的执行流程。...launch { val result = withContext(Dispatchers.IO) { // 在IO线程上执行异步操作 } // 在UI线程处理结果...下面将深入介绍如何使用协程来处理并发任务和顺序性操作,以及如何在不同的场景中组合多个协程的执行流程。 并发任务 协程使并发任务的管理变得非常直观。...runBlocking { val result = withContext(Dispatchers.IO) { fetchFromDatabaseAsync()...下面将介绍如何在Android应用中使用协程处理UI操作,确保用户界面的流畅和响应。

40240

Kotlin中的协程及在Android中的应用

Log.e("协程","我们使用async启动了一个协程") } 作用域 CoroutineScope(Dispatchers.IO).launch { } 和 GlobalScope.launch...(Dispatchers.IO){ } 这两种方式都是在指定的 IO 调度器中启动一个协程,但它们之间有一些区别: GlobalScope.launch(Dispatchers.IO){} 是在全局范围内启动一个协程...UI,例如Android中的主线程 Unconfined:非受限调度器,无所谓调度器,当前协程可以运行在任意线程上 GlobalScope的协程调度器是Dispatchers.Default,那么我们如何改变呢...Kotlin给我们提供了一个顶层函数withContext用于改变协程的上下文并执行一段代码。...() -> T ): T 示例: GlobalScope.launch(Dispatchers.Main) { val result = withContext(Dispatchers.IO)

8710
领券