android - 是任务.await() 主要安全吗?
问题描述
我正在编写我的第一个 Kotlin 应用程序,并且正在使用 firebase 服务进行身份验证、数据库和存储。由于无法进行原子 Firestore + Storage 操作,我发现自己正在退出回调地狱以进行简单的图像上传(带有错误回退和所有)。因此 - 我决定重构我的应用程序以使用协程。我找到了一些示例(例如此处和此处),但我注意到这些示例中的存储库级函数没有像android docswithContext(Dispatchers.IO){ }
中所示那样包装。他们应该吗?我想这是两个问题合二为一:
- 是否应该始终使用 IO 调度程序调用 Firebase 操作?
kotlinx-coroutines-play-services
的Task<T>.await()
主要安全吗?
还有一个额外的问题:我将所有 Firebase 调用包装在一个代理对象中以进行解耦 - 有没有办法将对象(/类)的所有函数设置为在相同的上下文中运行,或者我是否必须分别包装每个withContext(Dispatchers.IO){ }
函数?
非常感谢!
解决方案
- 是否应该始终使用 IO 调度程序调用 Firebase 操作?
除非 API 文档中另有说明,否则所有 Firebase API 都是异步的,旨在从主线程安全调用。
- kotlinx-coroutines-play-services 的 Task.await() 主要安全吗?
是的。正如API 文档所述(强调我的):
等待任务完成而不阻塞线程。
它是一个suspend fun
,并且它们不会阻塞。但是,在协程之外调用它们并没有真正的意义。
推荐阅读
- php - 当我尝试获取所有记录时,GraphQL 返回错误消息“无法查询字段...”
- scheme - 编写一个获取两个列表的过程 - lst,dup-count - 并根据 dup-count 复制 lst(下面的解释)
- python-3.x - 如何使用每个参数的值列表将 url 参数传递给 Django 模型过滤器
- c++ - 函数不能用作“constexpr”函数
- javascript - ReferenceError:进程未定义模块.../../../node_modules/graphql/jsutils/instanceOf.mjs
- javascript - 如何在 Chakra UI 主题中设置自定义过渡
- reactjs - 为什么我不能将来自单独文件的组件与 React 三纤一起使用?
- c - #define 带有 switch 案例的语句
- r - 为什么 diff 与分组的小标题一起使用时会产生意想不到的结果
- github - 如果某些带有“continue-on-error:true”的作业失败,则使 Github Actions Workflow 失败