Я экспериментирую с сопрограммами и не уверен в передаче coroutineScope в простой Kotlin UseCase. Может ли такой подход вызвать утечку памяти?
Предположим, мы инициализируем наш 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)
}
}
}
}
Это безопасный код? Нет никакой разницы, если бы я объявил этот точный код в виртуальной машине? Если нет, это означает, что я могу передать coroutineScope в качестве аргумента конструктора ... Теперь я изначально подумал, что должен создать свой метод выполнения следующим образом:
fun CoroutineScope.execute(bitmap: Bitmap) {
launch {
val resizedBitmap = withContext(Dispatchers.IO) {
imagesPreparingForUploadUseCase.getResizedBitmap(bitmap, MAX_SIZE)
}
}
}
}
Насколько я понимаю, мы используем функцию расширения, чтобы метод использовал parent coroutineScope. Это означает, что мне не нужно передавать coroutineScope в качестве аргумента и просто изменять метод, чтобы использовать функцию расширения.
Однако, к моему удивлению, виртуальная машина не видит этот метод доступным! Почему этот метод недоступен для вызова из ВМ?
Он отмечен красным в ВМ:
private fun uploadPhoto(bitmap: Bitmap, isImageUploaded: Boolean) {
prepareDataForUploadingUseCase.execute(bitmap)
}
Он не отмечен красным из ВМ:
private fun uploadPhoto(bitmap: Bitmap, isImageUploaded: Boolean) {
prepareDataForUploadingUseCase.execute(viewModelScope, bitmap)
}
Если я неправильно понимаю, почему я должен использовать CoroutineScope как функцию расширения вместо передачи coroutineScope в качестве аргумента функции ?