I am fetching images by using retrofit with MVVM Architecture. Now I want to add some features like image editing or compression and uploading.

My question is . For MVVM architecture, is the business logic for these features a use case?

  • domain

    • usecase
      • ImageCompressionUseCase.kt
      • UploadImageUseCase.kt
  • ui

    • ImageCompressionViewModel.kt
    • ImageCompressionFragment.kt
    • UploadImageViewModel.kt
    • UploadImageFragment.kt

My brain says it's use cases but I'm a bit hesitant :)

ImageCompressionUseCase.kt

@Singleton
class ImageCompressionUseCase @Inject constructor(@ApplicationContext private val context: Context) {

    suspend operator fun invoke(name:String) : Result<File> = runCatching {

        withContext(Dispatchers.IO){

            val output = File(context.filesDir,"$name.png")

            // some logic to image compression

            output
        }
    }
}

ImageCompressionViewModel.kt

@HiltViewModel
class ImageCompressionViewModel @Inject constructor(private val imageCompressionUseCase: ImageCompressionUseCase) : ViewModel() {

    private val _isLoading = MutableLiveData<Boolean>()
    val isLoading get() = _isLoading

    private val _data = MutableLiveData<Result<File>>()
    val data get() = _data

    fun start(){
        viewModelScope.launch {
            _isLoading.value = true

            _data.value = imageCompressionUseCase("example_name")

            _isLoading.value = false
        }
    }
}

推荐答案

You are right - use case is used for single actions done within a single feature. Your features - Compression, editing and uploading photos - code should be accommodated in the Use Cases preferably in one use case per action.

What previously the plain MVVM did inside the ViewModel is now done in the use cases.

This way it makes code easy to understand and you can also use Compression or Editing feature use cases in different ViewModels without having to duplicate the code.

Android相关问答推荐

将Android Studio插件复制到离线网络

使用Retrofit2的API调用:我如何能够一直进行API调用,以更新数据而无需重新打开应用程序

Android Jetpack Compose Material3主题配色方案

Android在NavHost中的LazyColumn中编写约束布局:error - replace()在未放置的项目上调用

如何在Android中编写挂起函数和stateflow的单元测试

如何检测低性能 Android 设备进行条件动画渲染?

有没有办法迭代类型安全的项目访问器?

expo 上的 socket.io 无法从 Android 连接

在本地通知中设置自定义声音

Android Studio 在 list 文件中已经声明了活动类,但仍出现无法找到明确的活动类的错误

如何在 Delphi 和 Android 上避免 Indy Socket Error #13 Access denied 异常?

在 react native 中设置 react-native-paper 组件的样式

如何将一个 Composable 作为其参数传递给另一个 Composable 并在 Jetpack Compose 中显示/运行它

Jetpack Compose Arc 进度条动画(如何重启动画)

ImageBitmap 使用 Glide/Coil 到画布

无法解析依赖项'com.github.smarteist:autoimageslider:1.4.0-appcompat'

Android Studio 错误要求依赖它的库和应用程序针对 Android API 的 33 版或更高版本进行编译.

Kotlin Compose forEach 中的负间距

如何在 Jetpack Compose 中填充矢量图像的背景?

将生成的 AAR 与 Composables 一起使用时未解决的参考