android - Firebase 异步任务到协程
问题描述
我使用了暂停例程构建器来使 Firebase 任务从基于异步侦听器的代码转移到基于协程的代码。
这是我实现协程行为的挂起协程。
suspend fun <T> Task<T>.awaitTask(): T =
suspendCoroutine { continuation ->
addOnCompleteListener { task ->
if (task.isSuccessful) {
continuation.resume(task.result!!)//what to do if task.result is null
} else {
continuation.resumeWithException(task.exception!!)
}
}
}
这就是我调用它的方式
firebase.createUserWithEmailAndPassword(userCredentials.email!!, userCredentials.password!!).awaitTask()
一切正常,直到我们执行一个可能为空结果的任务。喜欢 。
firebase.currentUser?.updateProfile(profileUpdates)?.awaitTask()
这里更新成功后,task.result 为空。在这种情况下,应该将什么传递给 continuation.resume?。
解决方案
您的返回类型应该可以为空,因为它可以Task.getResult()
为空:
suspend fun <T> Task<T>.await() : T? = ...
如果您使用它来获得不可为空的结果,则在使用站点而不是在实现内部强制执行不可空性。
但是,当它已经在 中定义时,您为什么还要费心重新实现它kotlinx-coroutines-play-services
?
推荐阅读
- azure - properties.search.query 不是有效的日志或指标查询
- java - 每次我运行代码时的其他字段位置
- java - Robotframework.request - 如何使用内容“multipart/form-data”和键值发出 POST 请求
- python - 从列表中删除通配符字符串
- android - Flutter谷歌地图插件中的getbounds
- asp.net - AdWords API,更新到 v201809
- qt - 尝试访问qml全局变量,但是报错
- ruby-on-rails - 使用 ruby 更改背景图像
- ruby - 使用 logstash 时,将文档中的 @timestamp 作为 epoch-millis
- excel - 将单元格中的最后一个值重复到最后一行的末尾