您应该将coroutineScope作为函数参数传递吗?

问题描述 投票:0回答:1

我正在尝试协程,并且不确定将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作为函数参数传递

kotlin kotlin-coroutines android-mvvm kotlin-coroutines-flow
1个回答
0
投票

您可以将CoroutineScope用作函数参数,这没问题。但是,我建议您从UseCase中删除该责任。从ViewModelPresenter等启动协程扩展功能将在扩展类型的实例上调用。您无需在同一函数中调用launch {}withContext。要么做。 launch(Dispatchers.IO) {}。扩展功能不仅可以访问父级作用域,还可以将其用于任何需要的用途,然后选择。

© www.soinside.com 2019 - 2024. All rights reserved.