Task<T>.await() 主线程安全吗?

Ome*_*evy 2 android kotlin firebase kotlin-coroutines

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

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

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

多谢!

Dou*_*son 5

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

所有 Firebase API 都是异步的,并且设计为从主线程安全调用,除非 API 文档中另有说明。

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

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

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

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