android - 将Firebase与Kotlin协同程序一起使用:取消作业时不会取消任务

标签 android firebase kotlin firebase-storage

在协程内部,借助“kotlinx-coroutines-play-services”库中的await()函数,我使用了类似的方法:

suspend fun uploadFile(uri: Uri) = withContext(IO) {
    Firebase.storage.reference.child("example").putFile(uri).await()
}
问题是当当前协程的作业被取消时,该任务不会随之取消,而是继续执行。
取消作业后,我需要所有嵌套任务自动停止。有没有办法可以做到这一点?

最佳答案

如果我对您的理解正确,那么您的repository就属于应用程序范围,因此您的应用程序中只有一个实例。
假设您从repository调用ViewModel函数。您可以使用viewModelScope从具有生命周期意识的协程调用它,并且在viewModel销毁后将停止。
它可能看起来像这样:

fun uploadFile(uri: Uri) = viewModelScope.launch(Dispatchers.IO) {
    repo.uploadFile(uri)
}
现在repository函数看起来像这样:
suspend fun uploadFile(uri: Uri) {
    Firebase.storage.reference.child("example").putFile(uri).await()
}
如果您从activityfragment而非viewModel调用它,则可以编写:
lifecycleScope.launch(Dispatchers.IO){
    repo.uploadFile(uri)
}
如果您有类似repository或其他的嵌套调用,例如UseCase,则只需要在途中的每个函数中添加suspend关键字。
编辑:
您可以取消coroutine,但是很遗憾,您不能取消firebase请求。因此,当您取消coroutine且文件不应该远程保存时,您要处理这种情况。一种简单的方法是使用onDetach或其他一些方式来处理它(即fragmentactivity)。您可以使用的一种技巧是将代码放入try块中的存储库中,并添加finally块。取消coroutine时,它将运行,您可以在其中检查文件是否已保存,如果已保存,则将其删除。
suspend fun uploadFile(uri: Uri) {
    try {
        Firebase.storage.reference.child("example").putFile(uri).await()
    } finally {
        // here handle canceled coroutine
    }
}
您可以阅读有关它的更多信息here

关于android - 将Firebase与Kotlin协同程序一起使用:取消作业时不会取消任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64195870/

相关文章:

android - 无法部署自定义图像分类模型 (TFLITE)

java - 如何以编程方式添加底部填充以跨越RelativeLayout中textView的内容

android - File.listFiles 因无效的 UTF-8 字符而崩溃

android - AlertDialog 没有正确使用 Material 设计?

python - 如何在 Firebase 中为 python 代码安排作业?

javascript - Firebase 查询从 Node 返回空对象,但不返回 API

ios - Firebase 配置快速崩溃

date - Kotlin:获取两个日期(现在和以前的日期)之间的差额

android - 访问 fragment 内部的数据库处理程序

kotlin - 检查列表列表是否具有重复元素的功能方法