协程

时间:2024-04-05 22:45:46编辑:奇事君

协程异常、取消、失败处理

CoroutineExceptionHandler是CoroutineContext的子类,可以用“+”进行连接,传入CoroutineScope或者launch函数(只能放入顶层协程) 创建协程的时候会返回一个Job对象,并且Job也是CoroutineContext的子类,这个对象提供了一个cancel方法来取消协程: 当多个协程时可以这么写: 另外ktx的LifeCycler库已经封装了协程的取消操作,只需要用这个库的scope来launch协程就可以不用自己手动取消协程 协程的失败不是指程序崩溃,崩溃的情况下就谈不上失败了。协程失败的前提是将程序的异常捕获住,才能谈协程的失败。当一个协程失败时,会将失败事件冒泡到上一层,就是上图中的parent层,然后parent层会调用所有子协程的cancel()方法,将所有的子协程结束掉,然后调用自己的cancel()方法,接着继续往上冒泡,直至到顶层协程。一个协程一旦被取消之后,就不能再进行launch()。这个时候就需要使用SuperVisorJob来解决这个问题。SuperVisorJob本质上也是Job,只不过它有一个额外的行为:如果一个子协程失败时,SupervisorJob 不会对子协程或者它自己做任何其他的处理,你自己失败就可以了,这个是 SupervisorJob 它的作用。 将协程的Job换成SupervisorJob 这样两个协程之间就不会互相影响,再看如下情况: 内部两个协程的不会继承父协程的SupervisorJob,因为协程的结构化中有一个规则: when the parent of a coroutine is another coroutine, the parent Job will always be of type Job(当协程的父级是另一个协程时,父级Job的类型始终为Job) ,所以它们的上下文依旧是最普通的Job,所有会相互影响,只需要在外层包上一层supervisorScope函数即可: 注意点:SupervisorJob()是为顶层协程设计的 参考自: https://medium.com/androiddevelopers/coroutines-first-things-first-e6187bf3bb21

线程和协程有什么区别呢?

协同程序(coroutine)与多线程情况下的线程比较类似:有自己的堆栈,自己的局部变量,有自己的指令指针(IP,instruction pointer),但与其它协同程序共享全局变量等很多信息。协程(协同程序): 同一时间只能执行某个协程。开辟多个协程开销不大。协程适合对某任务进行分时处理。线程: 同一时间可以同时执行多个线程。开辟多条线程开销很大。线程适合多任务同时处理。1.协程,即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态。协程实际上是在一个线程中,只不过每个协程对CUP进行分时,协程可以访问和使用unity的所有方法和component2.线程,多线程是阻塞式的,每个IO都必须开启一个新的线程,但是对于多CPU的系统应该使用thread,尤其是有大量数据运算的时刻,但是IO密集型就不适合;而且thread中不能操作unity的很多方法和component


上一篇:百度搜索开放平台

下一篇:桃华月禅