携程订酒店 协程

协程异常、取消、失败处理 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()是为顶层协程设计的
参考自:

携程订酒店 协程

文章插图
协程的异常处理什么情况下 try-catch 会失效?
这就不得不提到一个新的知识点,协程的结构化并发 。
什么是协程的结构化并发?
在Kotlin的协程中,全局的GlobalScope是一个作用域,每个协程自身也是一个作用域,新建的协程与它的父协程作用域存在一个级联的关系,也就是一个父子关系层次结构 。他们有以下特点:
上面的三点也就是协程结构化并发的特性 。在这种情况下,我们就应该使用一个新的处理异常的方法: CoroutineExceptionHandler。
什么是CoroutineExceptionHandler ?
CoroutineExceptionHandler怎么用呢?
CoroutineExceptionHandler的不足在哪里?
协程中不使用try-catch ,利用CoroutineExceptionHandler作为全局捕获异常的机制,最后异常会在CoroutineExceptionHandler中处理 。但是有两点需要注意:
如果你想并行请求多个接口,并且需要他们彼此不影响任务的执行,也就是任何一个接口异常,其他任务将继续执行,那么CoroutineExceptionHandler不是一个很好的选择 。而接下来说的supervisorScope更适合这种情况 。
了解一下SupervisorScope+async吧?
总结一下吧:
android使用协程本文只说明协程怎么在android中使用,如果您对协程的概念,语法等不熟悉,请自行搜索学习 。
当前最新版本1.3.9
为了开发方便这里BaseActivity里实现协程,其他Activity都继承BaseActivity 。
如果您不想这样写个BaseActivity,当然也是可以的 。一定 一定 一定 要记着在onDestory中取消协程,否则容易造成内存泄漏哦!
在MainActivity中实现如图所示的功能 。即下拉刷新并发发送网络请求,当所有请求都完成后刷新列表 。
launch(Dispatchers.Main) 即启用一个协程,Dispatchers.Main说明改协程运行在UI线程上,即在该协程里可以直接操作UI 。
async即并发的在IO线程进行网络请求 。接下来我们看一下 Api.getChapters(book,null)是什么样子的
suspend修饰符 告诉编译器getChapters函数需要在协程中执行 。withContext(Dispatchers.IO)说明了该方法运行与io线程 。
到此这个简单的业务就完成了 。

    秒懂生活扩展阅读