我正在尝试协程,并且不确定将coroutineScope传递给普通的Kotlin UseCase。这种方法会造成内存泄漏吗?
假设我们正在VM中初始化UseCase,并将尝试通过viewModelScope:
class UploadUseCase(private val imagesPreparingForUploadUseCase: ImagesPreparingForUploadUseCase){
fun execute(coroutineScope: CoroutineScope, bitmap: Bitmap) {
coroutineScope.launch {
val resizedBitmap = withContext(Dispatchers.IO) {
imagesPreparingForUploadUseCase.getResizedBitmap(bitmap, MAX_SIZE)
}
}
}
}
这是安全代码吗?如果我在VM中声明这个确切的代码没有区别?如果没有,那意味着我可以将coroutineScope作为构造函数参数传递。...现在,我最初认为应该以以下方式创建我的execute方法:
fun CoroutineScope.execute(bitmap: Bitmap) {
launch {
val resizedBitmap = withContext(Dispatchers.IO) {
imagesPreparingForUploadUseCase.getResizedBitmap(bitmap, MAX_SIZE)
}
}
}
}
据我所知,我们使用扩展功能来使方法使用parent coroutineScope。这意味着,我不需要将coroutineScope作为参数传递,而只需更改方法即可使用扩展功能。
但是,令我惊讶的是,VM无法看到此方法!为什么无法从VM调用此方法?
在VM中被标记为红色:
private fun uploadPhoto(bitmap: Bitmap, isImageUploaded: Boolean) {
prepareDataForUploadingUseCase.execute(bitmap)
}
未从VM标记为红色:
private fun uploadPhoto(bitmap: Bitmap, isImageUploaded: Boolean) {
prepareDataForUploadingUseCase.execute(viewModelScope, bitmap)
}
如果我的理解是错误的,为什么我要使用CoroutineScope作为扩展函数而不是将coroutineScope作为函数参数传递?
您可以将CoroutineScope
用作函数参数,这没问题。但是,我建议您从UseCase
中删除该责任。从ViewModel
,Presenter
等启动协程扩展功能将在扩展类型的实例上调用。您无需在同一函数中调用launch {}
和withContext
。要么做。 launch(Dispatchers.IO) {}
。扩展功能不仅可以访问父级作用域,还可以将其用于任何需要的用途,然后选择。