|
@@ -1,12 +1,14 @@
|
|
|
Net的网络请求本身支持在官方的自带的作用域内使用, 但是考虑到完整的生命周期和错误处理等推荐使用Net内部定义的作用域.
|
|
|
|
|
|
-<br>
|
|
|
-全部使用顶层扩展函数
|
|
|
+> 全部使用顶层扩展函数
|
|
|
+
|
|
|
+本质上Net的请求动作函数返回的是一个Deferred对象. 可以在任何协程作用域内执行. 但是协程默认的作用域没有生命周期进行处理.
|
|
|
|
|
|
+这里建议你使用Net提供的创建作用域函数.
|
|
|
|
|
|
## 异步任务的作用域
|
|
|
|
|
|
-快速创建可以捕捉异常的协程作用域, 以下作用域不会触发全局错误处理
|
|
|
+创建可以捕捉异常的协程作用域, 但是不会触发`NetErrorHandler`(默认异常处理者)
|
|
|
|
|
|
|函数|描述|
|
|
|
|-|-|
|
|
@@ -31,31 +33,52 @@ Net的网络请求本身支持在官方的自带的作用域内使用, 但是考
|
|
|
|`StateLayout.scope`|创建跟随[StateLayout](https://github.com/liangjingkanji/BRV)生命周期的作用域|
|
|
|
|
|
|
<br>
|
|
|
-
|
|
|
> PageRefreshLayout/StateLayout 属于[BRV](https://github.com/liangjingkanji/BRV)框架中的布局, 用于支持[自动化缺省页/下拉刷新](auto-state.md)
|
|
|
<br>
|
|
|
|
|
|
-## 捕捉异常/执行完成
|
|
|
-```kotlin
|
|
|
-scope {
|
|
|
- // scope系列函数的这个大括号里面就是作用域
|
|
|
+
|
|
|
+> 如果想了解详细的协程使用方式, 可以查看我的一篇文章: [最全面的Kotlin协程: Coroutine/Channel/Flow 以及实际应用](https://juejin.im/post/6844904037586829320)
|
|
|
+
|
|
|
+有时候可能面临嵌套的`scope*`函数或者作用域内有子作用域情况, 这个时候的生命周期是如何
|
|
|
+
|
|
|
+
|
|
|
+## 嵌套Scope
|
|
|
+
|
|
|
+```kotlin hl_lines="5"
|
|
|
+scopeNet {
|
|
|
+ val task = Post<String>("api0").await()
|
|
|
+
|
|
|
+ scopeNet {
|
|
|
+ val task = Post<String>("api0").await() // 此时发生请求错误
|
|
|
+ }.catch {
|
|
|
+ // A
|
|
|
+ }
|
|
|
}.catch {
|
|
|
- // 协程内部发生错误回调, it为异常
|
|
|
- handleError(it) // 该函数会将错误再次传递给全局错误回调处理
|
|
|
-}.finally {
|
|
|
- // 协程内全部执行完成回调(包括子协程), it为异常(如果正常完成则为null)
|
|
|
+ // B
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-以下函数幕后字段`it`为异常对象
|
|
|
+- 以下嵌套作用域错误将会仅发生在`A`处, 并被捕获, 同时不影响外部`scopeNet`的请求和异常捕获
|
|
|
+- 两个`scopeNet`的异常抛出和捕获互不影响
|
|
|
+- `scopeNet/scopeDialog/scope`等函数同理
|
|
|
|
|
|
-| 函数 | 描述 |
|
|
|
-|-|-|
|
|
|
-| catch | 作用域被`catch`则不会被传递到全局异常处理回调中: [全局处理异常](error-handle.md), 除非使用`handleError`再次传递给全局 |
|
|
|
-| finally | 同样可以获取到异常对象, 且不影响全局异常回调处理 |
|
|
|
+## 子作用域
|
|
|
|
|
|
+```kotlin hl_lines="7 10"
|
|
|
+scopeNet {
|
|
|
+ val await = Post<String>("api").await()
|
|
|
|
|
|
-> 如果想了解详细的协程使用方式, 可以查看我的一篇文章: [最全面的Kotlin协程: Coroutine/Channel/Flow 以及实际应用](https://juejin.im/post/6844904037586829320)
|
|
|
+ launch {
|
|
|
+ val task = Post<String>("api0").await() // 此时发生请求错误
|
|
|
+ }.invokeOnCompletion {
|
|
|
+ // A
|
|
|
+ }
|
|
|
+}.catch {
|
|
|
+ // B
|
|
|
+}
|
|
|
+```
|
|
|
|
|
|
+- 这种情况 先执行`A`然后执行`B`, 并且都能捕获异常.
|
|
|
+- 同时`scopeNet`发生错误也会导致`launch`内的请求被取消, `launch`发生错误也会导致`scopeNet`发生错误
|
|
|
|
|
|
|