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

时间:2020-10-04 14:27:17

标签: 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()
}

问题是当取消当前协程的Job时,此任务不会随之取消,而是继续执行。

我需要所有嵌套任务才能在作业取消时自动停止。有办法可以实现吗?

1 个答案:

答案 0 :(得分:0)

如果我对您的理解正确,那么您的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之类的嵌套调用,则只需要在方法中的每个函数中添加suspend关键字即可。

编辑:
您可以取消UseCase,但是很遗憾,您不能取消coroutine请求。因此,当您取消firebase且文件不应远程保存时,您要处理这种情况。一种简单的方法是在coroutine中进行处理,或者在onDetachfragment中进行其他处理。您可以使用的一种技巧是将代码放在activity块中的存储库中,并添加try块。取消finally后,它将运行,您可以在其中检查是否保存了文件,如果已保存,则将其删除。

coroutine

您可以详细了解here