首页 > 解决方案 > 是任务.await() 主要安全吗?

问题描述

我正在编写我的第一个 Kotlin 应用程序,并且正在使用 firebase 服务进行身份验证、数据库和存储。由于无法进行原子 Firestore + Storage 操作,我发现自己正在退出回调地狱以进行简单的图像上传(带有错误回退和所有)。因此 - 我决定重构我的应用程序以使用协程。我找到了一些示例(例如此处此处),但我注意到这些示例中的存储库级函数没有像android docswithContext(Dispatchers.IO){ }中所示那样包装。他们应该吗?我想这是两个问题合二为一:

  1. 是否应该始终使用 IO 调度程序调用 Firebase 操作?
  2. kotlinx-coroutines-play-servicesTask<T>.await()主要安全吗?

还有一个额外的问题:我将所有 Firebase 调用包装在一个代理对象中以进行解耦 - 有没有办法将对象(/类)的所有函数设置为在相同的上下文中运行,或者我是否必须分别包装每个withContext(Dispatchers.IO){ }函数?

非常感谢!

标签: androidfirebasekotlinkotlin-coroutines

解决方案


  1. 是否应该始终使用 IO 调度程序调用 Firebase 操作?

除非 API 文档中另有说明,否则所有 Firebase API 都是异步的,旨在从主线程安全调用。

  1. kotlinx-coroutines-play-services 的 Task.await() 主要安全吗?

是的。正如API 文档所述(强调我的):

等待任务完成而不阻塞线程

它是一个suspend fun,并且它们不会阻塞。但是,在协程之外调用它们并没有真正的意义。


推荐阅读