我正在试验协程,并且不确定将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)
            }
        }
    }

}

据我了解,我们使用扩展功能以使方法使用父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作为函数参数传递?

最佳答案

我正在回答这个特定问题:“为什么VM不能调用此方法?”

该方法不可用,因为它需要一个接收器(CoroutineScope),但是由于位于类型声明UploadUseCase中,因此您已经具有隐式接收器。因此,您不能只调用方法的第二种形式,因为您将不得不以某种方式指定两个接收者。

幸运的是,Kotlin提供了一种简单的方法 with 方法。

private fun uploadPhoto(bitmap: Bitmap, isImageUploaded: Boolean) {
    with(prepareDataForUploadingUseCase) {
        viewModelScope.execute(bitmap)
    }
}

但是,我会说这很奇怪,并且同意@Marko Novakovic的建议,您应该从UseCase中删除此责任。

10-06 13:14