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

为什么我在一次又一次启动协程时得到MissingReferenceException异常?

MissingReferenceException 异常通常发生在Unity引擎中,当你尝试访问一个已经被销毁或者未被正确引用的对象时。在使用协程(Coroutine)时,如果协程依赖于某个对象,而该对象在协程执行过程中被销毁,就可能引发这个异常。

原因分析

  1. 对象销毁:协程可能在尝试访问的对象被销毁后仍然运行。
  2. 生命周期管理:对象的生命周期管理不当,导致协程在对象不存在时尝试访问它。
  3. 异步操作:协程中的异步操作可能导致对象在协程执行期间被销毁。

解决方法

  1. 检查对象引用: 确保在协程启动前,对象是存在的,并且没有被销毁。
  2. 检查对象引用: 确保在协程启动前,对象是存在的,并且没有被销毁。
  3. 使用 yield return null: 在协程中定期检查对象是否存在,如果不存在则停止协程。
  4. 使用 yield return null: 在协程中定期检查对象是否存在,如果不存在则停止协程。
  5. 取消协程: 在对象销毁时,取消所有依赖于该对象的协程。
  6. 取消协程: 在对象销毁时,取消所有依赖于该对象的协程。
  7. 使用 CoroutineisDone 属性: 在启动协程时,检查协程是否已经完成,避免重复启动。
  8. 使用 CoroutineisDone 属性: 在启动协程时,检查协程是否已经完成,避免重复启动。

应用场景

  • 游戏开发:在游戏开发中,协程常用于处理异步任务,如动画、网络请求等。确保对象在协程执行期间存在是非常重要的。
  • UI管理:在UI管理中,协程可以用于处理复杂的动画和交互逻辑,避免 MissingReferenceException 异常。

参考链接

通过以上方法,可以有效避免在启动协程时出现 MissingReferenceException 异常。确保对象引用的正确性和生命周期的管理是关键。

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

相关·内容

破解 Kotlin 协程(4) - 异常处理篇

究竟使用什么 Scope,大家自己根据实际情况来确定,我给出一些建议: 对于没有协程作用域,但需要启动协程的时候,适合用 GlobalScope 对于已经有协程作用域的情况(例如通过 GlobalScope...启动的协程体内),直接用协程启动器启动 对于明确要求子协程之间相互独立不干扰时,使用 supervisorScope 对于通过标准库 API 创建的协程,这样的协程比较底层,没有 Job、作用域等概念的支撑...异常在作用域内的传播:当协程出现异常时,会根据当前作用域触发异常传递,GlobalScope 会创建一个独立的作用域,所谓“自成一派”,而 在 coroutineScope 当中协程异常会触发父协程的取消...join 和 await 的不同:join 只关心协程是否执行完,await 则关心运行的结果,因此 join 在协程出现异常时也不会抛出该异常,而 await 则会;考虑到作用域的问题,如果协程抛异常...附加说明 join 在父协程被取消时有一个 bug 会导致不抛出取消异常,我在准备本文时发现该问题,目前已经提交到官方并得到了修复,预计合入到 1.2.1 发版,大家有兴趣可以查看这个 issue:No

1.3K10

写给Android工程师的协程指南

当 Kotlin协程 出现之后,上述问题可以说真正意义上得到了好的解法。其良好的可读性及api设计,使得无论是新手还是老手,都能快速享受到协程带来的舒适体验。...同时启动10w线程和协程 在协程官网,我们大概都能看到这样一句话,同时启动10w和线程和协程等等。...我们举个例子来看看,如下所示: 同时启动10w线程 同时启动10w协程 协程果然比线程快多了,那此时肯定就有同学说了,你拿协程欺负线程,咋不用线程池呢?...结果如下: 添加10w个任务 启动10w个协程 ???为什么线程池更快呢?...这里使用了 SupervisorJob() 的原因是,协程的异常是会传递的,比如当一个子协程发生异常时,它会影响它的兄弟协程与它的父协程。

1.5K40
  • 在 Android 开发中使用协程 | 上手指南

    注意: 协程被挂起时,系统会以抛出 CancellationException 的方式协作取消协程。捕获顶级异常 (如Throwable) 的异常处理程序将捕获此异常。...如果您做异常处理时消费了这个异常,或从未进行 suspend 操作,那么协程将会徘徊于半取消 (semi-canceled) 状态下。...协程失败时发出报错信号 在协程中,报错信号是通过抛出异常来发出的,就像我们平常写的函数一样。来自 suspend 函数的异常将通过 resume 重新抛给调用方来处理。...还记得我在一开始说的结构化并发是一系列编程语言特性和实践指南的集合,在 suspend 函数中引入无关联协程作用域违背了结构化并发规则。...同样,我还帮助您更深入去理解和使用 suspend 函数,通过确保它们在函数返回之前完成任务,或者是通过暴露异常来确保它们正确发出错误信号。

    1.5K20

    Kotlin 学习笔记(四)—— 协程的基础知识,面试官的最爱了~

    要说协程上下文在我们的开发中如何使用,我找了下网上的一些资料,提到较多的就是异常的捕获了。...CoroutineExceptionHandler 可以让我们在启动协程时设置一个统一的异常处理器,如果出现异常,就会执行相应的操作。这里的上下文还设置了协程运行的线程为 Main 主线程。...3.2 协程调度器 在 3.1 中已经出现过调度器的身影,就是当需要指定协程运行的线程时,使用调度器调度即可。在实际的使用中是通过 Dispatchers 对象来访问它们。...这也是为什么我们可以在协程中用写同步代码的思想,去写异步的逻辑。...async/await: Deferred:同样用于执行协程任务,成对出现,await 可以得到 async 异步操作后得到的执行结果 launch 方法之前已经介绍的再清楚不过了,这里看看另外的两种。

    1.6K30

    《快学 Go 语言》第 11 课 —— 千军万马跑协程

    (main goroutine)里面,上面的例子中我们在主协程里面启动了一个子协程,子协程又启动了一个孙子协程,孙子协程又启动了一个曾孙子协程。...子协程异常退出 在使用子协程时一定要特别注意保护好每个子协程,确保它们正常安全的运行。因为子协程的异常退出会将异常传播到主协程,直接会导致主协程也跟着挂掉,然后整个程序就崩溃了。...,主协程在异常退出时会打印堆栈信息。...在我的个人电脑上,这个程序瞬间创建了 200w 个协程,观察发现内存占用在 4G 多,这意味着每个协程的内存占用大概 2000 多字节。...同一个线程中最多只会存在一个处于运行态的协程,就绪态的协程是指那些具备了运行能力但是还没有得到运行机会的协程,它们随时会被调度到运行态,休眠态的协程还不具备运行能力,它们是在等待某些条件的发生,比如 IO

    90020

    Kotlin | 协程使用手册(不间断更新)

    所以在实际应用中,我们更推荐 : 在执行操作所在指定作用域内启动协程,而非随意使用 协程的取消与超时 cancelAndJoin 取消一个协程并等待结束 runBlocking {...注意 在概念上,async 就类似于 launch。它启动了一个单独的协程,这是一个轻量级的线程并与其它所有的协程一起并发的工作。...,将直接运行在当前线程 子协程 当一个协程被其他协程在 CoroutineScope 启动时,它将通过 CoroutineScope.CoroutineContext 来承袭上下文,并且这个新协程将成为父协程的子作业...当一个父协程被取消时,同时意味着所有的子协程也会取消。 然而,如果此时用 GlobalScope.launch启动子协程,则它与父协程的作用域将无关并且独立运行。...注意:onReceiver 在已经该关闭的通道执行会发生失败并抛出异常,我们可以使用onReceiveOrNull 子句在关闭通道时执行特定操作

    2.4K20

    Kotlin协程系列(三)

    本节,我们来探讨一下官方协程框架的更多功能,并将其运用到实际的生产当中,在这里,我以在Android中使用kotlin官方协程框架为例进行讲述。...2.launch函数启动一个协程   在Android开发中,我们一般将协程的作用域和Android组件的lifeCycle绑定在一起,这样,当组件销毁的时候,协程的作用域就会取消,协程也就销毁了,这样不会造成内存泄漏...,也就是start参数所设置的,总共有四种启动模式,如下所示: DEFAULT:创建协程之后,立即开始调度,在调度前如果协程被取消,其将直接进入取消响应状态 ATOMIC:协程创建后,立即开始调度,协程执行到第一个挂起点之前不响应取消...LAZY:只有协程被需要时,包括主动调用start,join,await等函数时才会开始调度,如果调度前被取消协程就会进入异常结束状态 UNDISPATCHED:协程创建之后立即在当前函数的调用栈中执行...,在得到想要的结果后要更新UI时又可以切换到UI线程上,非常的方便。

    27310

    Kotlin协程系列(一)

    言归正传,我们在学习一个新东西的时候,如果连这个东西"是什么"都回答不了,那么自然很难进入知识获取阶段的"为什么"和"怎么办"这两个后续环节了。因此,我们首先得知道协程的定义。   ...二.协程和线程的联系和区别   联系:协程和线程都可以实现并发性,允许程序在同一时间处理多个任务;协程和线程都可以用于异步编程。   区别:协程是一种轻量级的线程,运行在线程之上。...线程在等待某种资源或者等待I/O操作完成时,会被阻塞,并且在阻塞的期间还一直霸占着CPU资源。...,会得到返回值:   {协程体内   协程运行结束,结果为:Success(Hello Coroutine)}   也就是说,协程体的返回值会作为resumeWith的参数传入,如本例中就得到Success...,用来处理未捕获的异常   协程的标准库也为我们定义了一个空的协程上下文,EmptyCoroutineContext,里面没有任何数据。

    23610

    即学即用Kotlin - 协程

    概念 相信大家或多或少的都了解过,协程是什么,官网上这么说: “Essentially, coroutines are light-weight threads. 协程是轻量级的线程,为什么是轻量的?...除了简单的用法外,这里有两个问题得注意一下: collect 函数是一个 suspend 方法,所以它必须发生在协程或者带有 suspend 的方法里面,这也是我为什么在一开始的时候启动了 lifecycleScope.launch...lifecycleScope 是我使用的 Lifecycle 的协程扩展库当中的,你可以替换成自定义的协程作用域。 2....Flow 的消费线程在我们启动协程指定调度器的时候就确认好了,对应着启动协程的调度器。...我将会在下一篇文章中和大家讨论协程的原理,欢迎大家关注。 学习协程和 kotlin 还是很有必要的,我们团队在开发新的功能的时候,也全部选择了 Kotlin。

    1.5K20

    破解 Kotlin 协程(3) - 协程调度篇

    可能有朋友还会有疑问,我并没有在拦截器当中切换线程,为什么从 ③ 处开始有了线程切换的操作?...这里我们用到了 Dispatchers.Main 来确保 launch 启动的协程在调度时始终调度到 UI 线程,那么下面我们来看看 Dispatchers.Main 的具体实现。...我在我自己的 2015 款 mbp 上对于两种不同的情况分别循环运行 100 次,得到的平均时间如下: 线程数 10 1 耗时ms 1006.00 1004.97 注意,为了测试的公平性,在运行 100...越多的自由,意味着越多的代价,我们在 Jvm 上面编写协程代码时需要明白一点的是,线程安全问题在调度器不同的协程之间仍然存在。...如果大家在协程代码中使用锁之类的并发工具就反而增加了代码的复杂度,对此我的建议是大家在编写协程代码时尽量避免对外部作用域的可变变量进行引用,尽量使用参数传递而非对全局变量进行引用。

    76920

    协程中的取消和异常 | 异常处理详解

    异常会到达层级的根部,而且当前 CoroutineScope 所启动的所有协程都会被取消。...△ 协程中的异常会通过协程的层级不断传播 虽然在一些情况下这种传播逻辑十分合理,但换一种情况您可能就不这么想了。...异常会在它发生的第一时间被抛出 Async 当 async 被用作根协程 (CoroutineScope 实例或 supervisorScope 的直接子协程) 时不会自动抛出异常,而是在您调用 .await...这就是为什么没有必要将它也包裹进 try/catch 中,await 将会抛出 async 协程中产生的所有异常。...内部协程会在异常出现时传播异常并传递给它的父级,由于父级并不知道 handler 的存在,异常就没有被抛出。 优雅地处理程序中的异常是提供良好用户体验的关键,在事情不如预期般发展时尤其如此。

    1.1K20

    破解 Kotlin 协程 - 入门篇

    假定你对协程(Coroutine)一点儿都不了解。 通过阅读本文看看是否能让你明白协程是怎么一回事。 ? 1. 引子 我之前写过一些协程的文章,很久以前了。...那会儿还是很痛苦的,毕竟 kotlinx.coroutines 这样强大的框架还在襁褓当中,于是乎我写的几篇协程的文章几乎就是在告诉大家如何写这样一个框架——那种感觉简直糟糕透了,因为没有几个人会有这样的需求...首先我们通过 launch 启动了一个协程,这类似于我们启动一个线程, launch 的参数有三个,依次为协程上下文、协程启动模式、协程体: public fun CoroutineScope.launch...上下文有一个重要的作用就是线程切换, Dispatchers.Main 就是一个官方提供的上下文,它可以确保 launch 启动的协程体运行在 UI 线程当中(除非你自己在 launch 的协程体内部进行线程切换...、或者启动运行在其他有线程切换能力的上下文的协程)。

    56720

    破解 Kotlin 协程(1) - 入门篇

    我之前写过一些协程的文章,很久以前了。...那会儿还是很痛苦的,毕竟 kotlinx.coroutines 这样强大的框架还在襁褓当中,于是乎我写的几篇协程的文章几乎就是在告诉大家如何写这样一个框架——那种感觉简直糟糕透了,因为没有几个人会有这样的需求...首先我们通过 launch 启动了一个协程,这类似于我们启动一个线程,launch 的参数有三个,依次为协程上下文、协程启动模式、协程体: public fun CoroutineScope.launch...上下文有一个重要的作用就是线程切换,Dispatchers.Main 就是一个官方提供的上下文,它可以确保 launch 启动的协程体运行在 UI 线程当中(除非你自己在 launch 的协程体内部进行线程切换...、或者启动运行在其他有线程切换能力的上下文的协程)。

    80500

    协程中的取消和异常 | 取消操作详解

    调用 cancel 方法 当启动多个协程时,无论是追踪协程状态,还是单独取消各个协程,都是件让人头疼的事情。...在底层实现中,子协程会通过抛出异常的方式将取消的情况通知到它的父级。父协程通过传入的取消原因来决定是否来处理该异常。...不能在已取消的作用域中再次启动新的协程 如果您使用的是 androidx KTX 库的话,在大部分情况下都不需要创建自己的作用域,所以也就不需要负责取消它们。...例如,当 ViewModel 被清除时,在其作用域内启动的协程也会被一起取消。 为什么协程处理的任务没有停止? 如果我们仅是调用了 cancel 方法,并不意味着协程所处理的任务也会停止。...为什么会拿到这个异常呢?

    2.1K20

    【Kotlin 协程】协程启动 ④ ( 协程启动模式 | 协程构建器启动模式参数 | DEFAULT 模式 | ATOMIC 模式 | LAZY 模式 | UNDISPATCHED 模式 )

    * 得到的协程与其他语言中的类似原语相比有一个关键的区别 * 和框架:它取消父作业(或外部作用域)在执行*结构化并发*范式失败。...* * 协程启动选项的汇总如下: * * [DEFAULT]——根据上下文立即安排协程执行; * * [LAZY]—只在需要时才启动协程; * * [ATOMIC]——原子地(以不可取消的方式)...* * 如果协程[Job]在它甚至有机会开始执行之前被取消,那么它将不会启动它的 * 执行,但将以异常完成。...*/ DEFAULT, /** * 只有在需要时才会惰性地启动协程。...* * 如果协程[Job]在它甚至有机会开始执行之前被取消,那么它将不会启动它的 * 执行,但将以异常完成。

    1.1K10

    分享一波学习方向

    什么是“好”的技术,为什么“火” 前言:这个是个人观点,技术要用在合适的业务场景中才能体现出它的优势,而不是盲目的去学,去看 解决现今开发的技术痛点 协程 回调地狱,切换线程等功能 a()//耗时任务...选用合适的数据结构, 选用合适的算法,切合实际场景的设计模式 譬如协程中存储上下文的数据结构(链表),异常处理机制中用到的树的结构…等等(为什么这个这么少呢,因为我只学到了皮毛…) 插件化这个能学到什么呢...null(我返回的是0) val result= withTimeoutOrNull(指定超时时间为5秒){ //创建一个协程 suspendCoroutine{ //在这里进行阻塞代码...这是为什么呢?这里涉及到协程的异常取消机制了。 协程中创建了子协程后,会默认建立父子关系。当父协程取消后,需要把它所有的子协程全部取消掉,才算取消完成。...我认为的技术趋势在这里: 没错,就是上面讲的那两个哈哈: 协程 插件化 最后,前几天在群里看到大佬说的一句话觉得不错,分享给大家: 技术是不断变化的,卷是不变的。

    27620

    “新”for me,2022一起来看看这些技术

    什么是“好”的技术,为什么“火” 前言:这个是个人观点,技术要用在合适的业务场景中才能体现出它的优势,而不是盲目的去学,去看 解决现今开发的技术痛点 协程 回调地狱,切换线程等功能 a()//耗时任务...选用合适的数据结构, 选用合适的算法,切合实际场景的设计模式 譬如协程中存储上下文的数据结构(链表),异常处理机制中用到的树的结构......等等(为什么这个这么少呢,因为我只学到了皮毛....)...丰富的api 协程中很多api在使用的时候如果不了解它里面的一些原理机制,出现问题的几率是非常大的......这是为什么呢?这里涉及到协程的异常取消机制了。 协程中创建了子协程后,会默认建立父子关系。当父协程取消后,需要把它所有的子协程全部取消掉,才算取消完成。...我认为的技术趋势在这里: 没错,就是上面讲的那两个哈哈: 协程 插件化 最后,前几天在群里看到大佬说的一句话觉得不错,分享给大家: 技术是不断变化的,卷是不变的。

    21320
    领券