跳转至

作用域

创建不同协程作用域可以实现不同的功能

减少崩溃

Net所有作用域内抛出异常都会被捕获到, 可以防止应用崩溃

异步任务的作用域

可以捕捉异常的协程作用域, 用于构建普通异步任务

函数 描述
scope 创建最基础的作用域
scopeLife 创建跟随生命周期自动取消的作用域
ViewModel.scopeLife 创建跟随ViewModel生命周期的作用域, 如何在ViewModel创建作用域

网络请求的作用域

除异步任务外还适用于网络请求场景的作用域, 对比上面异步任务的作用域区别:

  1. 发生错误自动吐司(可以自定义或者取消)
  2. 发生错误会触发全局错误处理NetErrorHandler
  3. 具备一些特殊场景功能, 比如根据网络请求结果自动处理下拉刷新/上拉加载/缺省页/加载框的状态
函数 描述
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发生错误