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

只能在协程正文错误内调用挂起函数

基础概念

协程(Coroutine)是一种轻量级的线程,可以在程序中实现非抢占式的多任务并发。挂起函数(Suspending Function)是协程中的一种特殊函数,它可以在执行过程中挂起当前协程的执行,并在稍后恢复执行。

相关优势

  1. 轻量级:协程比线程更轻量,创建和销毁的开销更小。
  2. 高效:协程可以在单个线程内实现并发,避免了线程切换的开销。
  3. 简洁:挂起函数使得异步编程更加直观和简洁,避免了回调地狱。

类型

挂起函数主要有以下几种类型:

  1. 普通挂起函数:使用 suspend 关键字修饰的函数。
  2. 启动协程的挂起函数:使用 launchasync 关键字启动的协程中的挂起函数。
  3. 异常处理挂起函数:在协程中处理异常的挂起函数。

应用场景

挂起函数广泛应用于需要异步处理的场景,例如:

  • 网络请求
  • 文件读写
  • 数据库操作
  • 长时间运行的计算任务

问题及原因

问题:只能在协程正文错误内调用挂起函数。

原因:挂起函数只能在协程或其他挂起函数内部调用。这是因为挂起函数的执行依赖于协程的上下文,只有在协程内部才能正确地挂起和恢复执行。

解决方法

要解决这个问题,可以采取以下几种方法:

  1. 在协程内部调用挂起函数
  2. 在协程内部调用挂起函数
  3. 使用 asyncawait
  4. 使用 asyncawait
  5. 使用 withContext 切换上下文
  6. 使用 withContext 切换上下文

参考链接

通过以上方法,可以在协程内部正确调用挂起函数,避免在非协程上下文中调用挂起函数导致的错误。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Kotlin 】Flow 异步流 ① ( 以异步返回返回多个返回值 | 同步调用返回多个值的弊端 | 尝试在 sequence 中调用挂起函数返回多个返回值 | 调用挂起函数返回集合 )

文章目录 一、以异步返回返回多个返回值 二、同步调用返回多个值的弊端 三、尝试在 sequence 中调用挂起函数返回多个返回值 四、调用挂起函数返回集合 一、以异步返回返回多个返回值 ----...在 Kotlin Coroutine 中 , 使用 suspend 挂起函数 以异步的方式 返回单个返回值肯定可以实现 , 参考 【Kotlin 挂起和恢复 ① ( 挂起和恢复概念...| 的 suspend 挂起函数 ) 博客 ; 如果要 以异步的方式 返回多个元素的返回值 , 可以使用如下方案 : 集合 序列 Suspend 挂起函数 Flow 异步流 二、同步调用返回多个值的弊端...functions can only invoke member or extension suspending functions on their restricted coroutine scope 受限挂起函数能在其受限的范围上调用成员或扩展挂起函数...---- 如果要 以异步方式 返回多个返回值 , 可以在调用挂起函数返回集合 , 但是该方案只能一次性返回多个返回值 , 不能持续不断的 先后 返回 多个 返回值 ; 代码示例 : package

8.3K30

Kotlin知识累计

一个挂起函数能在另个挂起函数或者中被调用。...挂起函数必须要带suspend修饰,但不是说被suspend修饰的函数就是线程切换的点,而是这个挂起函数有直接或间接的调用kotlin自带的挂起函数来实现挂起,从而才实现线程的切换;suspend...注意: 1.单多 suspend 函数运行:suspend 函数挂起挂起的是当前suspend 函数所在的;一个的多个suspend 挂起函数是顺序执行的,上面的suspend函数没执行完是不会执行其他的...delay挂起不影响爷爷调用其子 3.一个线程创建的多个子,一个挂起,当前线程就会去执行其他。...从源码可知folw是执行了挂起函数的,flow是中的库,只能用于环境。

21110
  • kotlin--入门

    的代码很容易理解,就是等待耗时任务返回结果,然后将结果设置到TextView上 的核心就是函数或一段程序能够被挂起,稍后再在挂起的位置恢复。...玩过单片机的同学,肯定会觉得这个和“中断”很像,理解起来是差不多的,当然这两个是完全不同的层级了 二、挂起与恢复 常规函数基础操作除了的invoke(或call)和return,新增了suspend...和resume suspend:也称为挂起或暂停,用于暂停执行当前,并保存所有局部变量 resume:用于让已暂停的从其暂停出继续执行 1.挂起函数 使用suspend关键字修饰的函数叫做挂起函数...挂起函数能在体内或其他挂起函数调用 挂起主要是和阻塞进行对比,挂起函数调用时并不会阻塞当前线程 挂起: class MainActivity : AppCompatActivity() {...1.取消任务,当某项任务不需要执行了,取消它 2.追踪任务,某项任务正在执行,追踪它 3.发出错误信号,当失败时,发出错误信号表明有错误产生 CoroutineScope 定义必须指定其

    60710

    Kotlin系列(一)

    ,在体内我们可以直接使用作用域提供的函数或者状态等。   ...(4)函数挂起   我们已经知道使用suspend关键字可以声明一个挂起函数挂起函数能在体内或其他挂起函数调用。这样一来,整个kotlin语言体系就可以分为两派:普通函数挂起函数。...其中挂起函数中可以调用任何函数,普通函数中只能调用普通函数。   但是,需要注意的是,挂起函数不一定真的会挂起,只是提供了挂起的条件。那什么时候才会挂起呢?...在回答这个问题之前我们先来了解一个概念:挂起点,在内部挂起函数调用处被称为挂起点,只有当挂起点处发生异步调用,当前才会被挂起,直到这个协对应的continuation实例的resumeWith...(6)的拦截器   我们现在已经知道Kotlin可以通过调用挂起函数实现挂起,可以通过Continuation的恢复调用实现恢复,还知道可以通过绑定一个上下文来设置一些数据来丰富的能力,

    22210

    Android的7个必要知识点

    上下文与调度器: 理解上下文的概念,包括调度器(Dispatcher)的作用,如何在不同的线程上执行代码。 挂起函数: 掌握挂起函数的概念,以及如何在调用和编写挂起函数。...挂起函数 在Kotlin Coroutine中,挂起函数是一种特殊的函数,它可以在内部被挂起,等待异步操作完成而不会阻塞线程。挂起函数异步编程的核心。...下面将详细介绍挂起函数的概念,以及如何在调用和编写挂起函数,并学会处理异常和错误。...suspend fun fetchUserData(): UserData { // 执行异步操作,等待数据返回 } 在调用挂起函数内部调用挂起函数是直接的,你可以像调用普通函数一样调用挂起函数...通过掌握挂起函数调用、编写和异常处理,你可以更好地在中处理异步操作,确保代码的可靠性和稳定性。 作用域 在异步编程中,的生命周期和范围管理是至关重要的。

    63952

    Android面试题之Kotlin一文搞定

    基于线程,是轻量级的线程 作用 处理耗时任务,这种任务常常会阻塞主线程 保证主线程安全,即确保安全地从主线程调用任何suspend函数 特点 让异步逻辑同步化 最核心的点就是,函数或者一段程序能够被挂起...,稍后再在挂起得位置恢复 挂起函数 使用suspend关键字修饰的函数 挂起函数能在体内或其他挂起函数调用 挂起和阻塞的区别 挂起不会阻塞主线程,主线程可以正常刷新UI,但阻塞就会导致主线程ANR...可以取消任务、追踪任务、失败时发出错误信号 作用域CoroutineScope 可以追踪所有,也可以取消协 GlobalScope:生命周期是Process级别,即使Activity或Fragment...LAZY:只有被需要时,包括主动调用的start、join或者await等函数时才会开始调度,如果调度前就被取消,那么该将直接进入异常结束状态 @Test fun `test start...job.await() } UNDISPATCHED:创建后立即在当前函数调用栈中执行,直到遇到第一个真正的挂起点 @Test fun `test start mode`() = runBlocking

    14010

    【翻译】深入 Kotlin

    如何使用基于一种新的函数类型,叫做挂起函数。我们可以在函数名称前使用一种新的语言关键字 suspend 来标记。用这个关键字标记的函数能够暂停一个的执行,且不会阻塞当前线程。...suspend fun fetchUserData(userId: String): String { // return user String } 一个挂起函数只能被或者其他挂起函数调用...调用 Job 类的 join() 方法将暂停它所包含的的运行。 async{} 通过使用 async 函数你可以达到和 launch 一样的效果,唯一一个非常重要的差别是:它有返回值。...在那种特定上下文的情形下,调用一个可以保证与 UI 相关连的代码(比如设置标签的文本)都能在 UI 线程中被调用。 第二个参数 start 是指明何时应该开始执行。...通过使用 CoroutineStart.LAZY 这个值,可以让在开发者显式调用返回的 Deferred 实例或者 Job 实例的 await() 方法或者 join() 方法才开始运行。

    1.4K10

    Kotlin Vocabulary | 揭秘中的 suspend 修饰符

    本文概要: Kotlin 编译器将会为每个挂起函数创建一个状态机,这个状态机将为我们管理的操作!...作为开发者,您可以把挂起函数看作是普通函数,只不过它可能会在某些时刻挂起和恢复而已。 不同于回调,提供了一种简单的方式来实现线程间的切换以及对异常的处理。...而该参数将会被用于向调用挂起函数返回结果: fun loginUser(userId: String, password: String, completion: Continuation<Any...它会用于恢复那些执行了参数代码块后挂起; 您可以在一个挂起函数上使用 startCoroutine 扩展函数,它会接收一个 Continuation 对象作为参数,并会在新的结束时调用它,无论其运行结果是成功还是异常...下面我们来看看编译器生成了什么: when 语句的参数是 LoginUserStateMachine 实例的 label; 每一次处理新的状态时,为了防止函数挂起时运行失败,都会进行一次检查; 在调用下一个挂起函数

    2.2K10

    Kotlin解析系列(上):调度与挂起

    图片 图片 注意: await() 不能在程之外调用,因为它需要挂起直到计算完成,而且只有可以以非阻塞的方式挂起。所以把它放到中。...coroutineScope 创建一个独立的作用域,直到所有启动的都完成后才结束自身。 它是一个挂起函数,需要运行在挂起函数。...挂起函数能在或另一个挂起函数中被调用,如果你在非中使用到了挂起函数,会报错。...只有挂起函数或者中才有Continuation,所以挂起函数能在或者其他挂起函数中执行。 5.2.1 Continuation 这里看一下该Continuation的传递来源。...这个函数能在或者挂起函数中执行,说明Continuation很有可能是从中传入来的,查看构建源码。

    1.9K40

    【Kotlin 挂起和恢复 ① ( 挂起和恢复概念 | 的 suspend 挂起函数 )

    文章目录 一、挂起和恢复概念 二、的 suspend 挂起函数 一、挂起和恢复概念 ---- 函数 最基本的操作 是 : 调用 call : 通过 函数名或函数地址 调用函数 ; 返回...return : 函数执行完毕后 , 继续执行函数调用的下一行代码 ; 调用 call 和 返回 return 基础上 , 又新增了两种 状态 : 挂起 Suspend : 暂停当前执行的..., 只能在 体内部 或者 其它挂起函数调用 ; 外部不允许使用挂起函数 ; 在中 , 执行 挂起 Suspend 函数 , 将 挂起点的信息 记录下来 , 然后执行耗时操作 , 执行完毕后...() { // 函数体 } 如果在 函数 A 中调用上述 Test 挂起函数 , 则 函数 A 也必须是 挂起函数 ; 在中 , GlobalScope.launch(Dispatcher.Main...){} 中 , 可以直接调用挂起函数 ; 挂起 函数 , 只能在 体内部 或者 其它挂起函数调用 ; 外部不允许使用挂起函数 ; 在中 , 执行 挂起 Suspend 函数 , 将 挂起点的信息

    1.6K40

    (StateFlow & ShareFlow) VS (Flow & LiveData)来看业务适合哪个?

    : 对于LiveData来说,通过观察调用observe函数的时候传入LifecycleOwner内部注册生命周期回调的方式相比;Flow的观察collect函数需要在调用也就是需要自动管理的生命周期...,否则可能会出现开启收到数据变化更新UI发送NPE的错误,所以需要控制好调用collect的域Scope的生命周期,好在Android提供了几个协作用域的api去开启:1.viewModelScope...:跟随ViewModel的生命周期变化,当ViewModel观察的组件销毁调用onClear的时候自动取消协,生命周期过长不采取一般在对数据进行处理的时候会使用2.lifecycleScope: 此范围启动的会在... Lifecycle 被销毁时取消;也可以通过when生命周期来指定何时开启,如果 Lifecycle 未至少处于所需的最低状态,则会挂起在这些块运行的任何,注意是挂起而不是销毁时的取消,意味着还是会浪费资源...一定要注意取消这个词和挂起的区别,挂起其实还是有订阅关系的当flow发射时还是会收到走collect上游并没有取消,但是取消就是作用域的取消collect函数不会执行了。

    66140

    在 Android 开发中使用 | 上手指南

    本文是介绍 Android 系列中的第二部分,这篇文章主要会介绍如何使用来处理任务,并且能在任务开始执行后保持对它的追踪。...await 的挂起函数返回 result。...通常,您应使用 launch 从常规函数中启动新。因为常规函数无法调用 await (记住,它无法直接调用 suspend 函数),所以将 async 作为的主要启动方法没有多大意义。...scope.launch { // 这段代码在作用域里启动了一个新 // 它可以调用挂起函数 fetchDocs() } 您可以将 launch 看作是将代码从常规函数送往世界的桥梁...即使是启动一个新的,也不会出现泄漏,因为在新的完成之前,调用方始终处于挂起状态。

    1.5K20

    (StateFlow & ShareFlow) VS (Flow & LiveData)

    这两个Flow和普通的Flow不一样, Flow我们知道,只有当调用collect的时候flow传入的函数才会执行,并且每次调用collect都会重新走一遍flow函数(本质是扩展函数),调用collect...函数需要在调用也就是需要自动管理的生命周期,否则可能会出现开启收到数据变化更新UI发送NPE的错误,所以需要控制好调用collect的域Scope的生命周期,好在Android提供了几个协作用域的...2.lifecycleScope: 此范围启动的会在 Lifecycle 被销毁时取消;也可以通过when生命周期来指定何时开启,如果 Lifecycle 未至少处于所需的最低状态,则会挂起在这些块运行的任何...一定要注意取消这个词和挂起的区别,挂起其实还是有订阅关系的当flow发射时还是会收到走collect上游并没有取消,但是取消就是作用域的取消collect函数不会执行了。...由于后面的 API 会挂起,而不是在 Lifecycle 处于 STOPPED 状态时取消。上游数据流会在后台保持活跃状态,并可能会发出新的项并耗用资源。 需要给定一个初始值。

    99340

    Kotlin---的使用

    并且这样执行的,并不会阻塞主线程的执行 delay函数能在中使用,否则编译不过,尽量避免使用GlobalScope.launch创建,当我们使用 GlobalScope.launch 时...main @coroutine#1 CoroutineScope作用域 在runBlocking中可以定义一个coroutineScope,而该函数的作用是为在这个函数中启动的添加作用域,只有当作用域都执行完毕后...,才会继续执行 挂起函数中的代码超级多的时候,通常都会把这些代码提取到一个函数中。...但是这个函数必须使用suspend标识,否则编译错误,并且无法调用中到函数,比如delay()。...使用suspend标示的函数只能用于中,无法在其他函数中被调用 import kotlinx.coroutines.* fun main() = runBlocking { launch

    1.3K20

    Room 🔗 Coroutines

    Coroutines Room 2.1(目前为 alpha 版本)添加了对 Kotlin 的支持。DAO 方法现在可以被标记为挂起以确保他们不会在主线程执行。...事务 Room 不会对触发数据库语句的上下文(CoroutineContext)做任何处理。方法调用者有责任确保当前不是在 UI 线程。...由于 suspend 方法只能在其他 suspend 方法或调用,因此需确保你使用的 Dispatcher 是 Dispatchers.IO 或自定义的,而不是 Dispatcher.Main。...数据库被打开同时处于事务 这种情况下触发了 call 方法,即用户在数据库中的实际插入操作 情形 2....在 DAO 方法上添加 suspend 修饰符并在其他 supend 方法或者调用。 感谢 Chris Banes 和 Jose Alcérreca。

    94010

    【Lua】

    线程和协的主要区别: 一个多线程程序可以同时并行运行多条线程,而却需要彼此协作地运行,即在任意时刻只能有一个运行,且的切换是在用户态手动控制的,只有当正在运行的显示的要求被挂起(suspend...(对象, [传递给函数的参数1,2,3..]) -> state, value 开始/继续执行一个 正常执行:返回true和yield返回值 ; 发生一个未捕获错误:返回false和错误信息...coroutine.yield([返回值]) 挂起当前正在运行的 coroutine.status(对象) -> status 返回状态 create和yield后为挂起(suspended...coroutine.wrap(主体函数) -> function 创建一个以传入函数作为主体函数的新,并返回一个函数 返回的函数类似resume,不同的是调用不会返回state返回value,...而由于GetFibonacciNext这种写法很常见,即将唤醒对应调用包装在一个函数中,所以Lua语言专门为此提供了一个函数coroutine.wrap来完成这个功能。

    59030

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

    ("MainActivity", "withContext : 中执行耗时操作") } // 挂起函数, 可以不使用调度器 delay(20000) // 主线程更新 UI...是任务调度器 , 执行挂起函数 , 系统会自动分配一个 任务调度器 ; 二、取消 MainScope 作用域 ---- 调用 MainScope 作用域 的 cancel 函数 , 即可取...消该 作用域 , 同时 该作用域任务不管是否执行完毕 都一并取消 , 该函数是 CoroutineScope 的扩展函数 ; /** * 取消这个范围,包括它的作业和它的所有子任务...启动的任务 , 如果取消 mainScope 作用域 , 则在该 作用域 中执行的 任务 , 都会被取消 ; 挂起函数中途被取消 会抛出 JobCancellationException...launch 函数执行任务 , 调用 cancel 函数取消协作用域 ; 完整代码如下 : package kim.hsl.coroutine import androidx.appcompat.app.AppCompatActivity

    1.2K10
    领券