作用域
创建不同协程作用域可以实现不同的功能
减少崩溃
Net所有作用域内抛出异常都会被捕获到, 可以防止应用崩溃
异步任务的作用域¶
可以捕捉异常的协程作用域, 用于构建普通异步任务
函数 | 描述 |
---|---|
scope |
创建最基础的作用域 |
scopeLife |
创建跟随生命周期自动取消的作用域 |
ViewModel.scopeLife |
创建跟随ViewModel生命周期的作用域, 如何在ViewModel创建作用域 |
网络请求的作用域¶
除异步任务外还适用于网络请求场景的作用域, 对比上面异步任务的作用域
区别:
- 发生错误自动吐司(可以自定义或者取消)
- 发生错误会触发全局错误处理
NetErrorHandler
- 具备一些特殊场景功能, 比如根据网络请求结果自动处理下拉刷新/上拉加载/缺省页/加载框的状态
函数 | 描述 |
---|---|
scopeNet |
创建自动处理网络错误的作用域 |
scopeNetLife |
创建自动处理网络错误的作用域, 且包含跟随Activity或者Fragment生命周期 |
scopeDialog |
创建自动加载对话框的作用域, 生命周期跟随对话框 |
ViewModel.scopeNetLife |
创建跟随ViewModel生命周期的作用域, 如何在ViewModel创建作用域 |
PageRefreshLayout.scope |
创建跟随PageRefreshLayout生命周期的作用域 |
StateLayout.scope |
创建跟随StateLayout生命周期的作用域 |
区分函数接受者
注意StateLayout.scope
等存在函数接受者
的方法和scope
属于两个方法, 严禁混用
第三方库支持
PageRefreshLayout/StateLayout 属于第三方开源项目 BRV
框架中的布局, 可用于支持自动化缺省页/下拉刷新
如果想更了解协程使用方式, 可以阅读一篇文章: 最全面的Kotlin协程: Coroutine/Channel/Flow 以及实际应用
嵌套作用域¶
有时候可能面临内嵌scopeXX
函数(嵌套作用域), 这时候生命周期如下
scopeNetLife {
val task = Post<String>("path").await()
scopeNetLife {
val task = Post<String>("path/error").await() // 此时发生请求错误
}.catch {
// A
}
}.catch {
// B
}
- 错误将在
A
处可以获取到, 且不影响外部scopeNetLife
的请求 - 两个
scopeNetLife
的异常抛出和捕获互不影响 scopeXX()
等函数同理
子作用域¶
scopeNet {
val await = Post<String>("path").await()
launch {
val task = Post<String>("path/error").await() // 此时发生请求错误
}.invokeOnCompletion {
// A
}
}.catch {
// B
}
- 这种情况 先执行
A
然后执行B
, 并且都能捕获异常. - 同时
scopeNet
发生错误也会导致launch
内的请求被取消,launch
发生错误也会导致scopeNet
发生错误