Здравствуйте. Хотел бы попросить у вас совета. Я думал над реализацие clean architecture + mvvm и пришел к варианту.
1) Есть viewModel у нее имплементирую интерфейс назовем его ViewModelObserver и там к примеру будут метод provideList(data: MutableList).
2) В конструкторе ViewModel имеются интеракторы на каждое действие. К примеру InteractorGetList имеет метод execute.
3) Из viewModel вызывается метод execute который передает результат в метод provideList()
4) Проверил через leakCanary утечек не обнаружил.
Исходный код
ViewModel
class FragmentItemsViewModel(
var testInteractor: TestInteractor
): BaseViewModel(), ViewModelObserver{
override fun provideData(data: MutableList<String>) {
var f = 1
f = 2
}
fun doOperation(){
testInteractor.execute(viewModelScope, this)
}
}
Interactor
class TestInteractor {
fun execute(scope: CoroutineScope, observer: ViewModelObserver)= scope.launch{
var data = withContext(Dispatchers.IO){
delay(5000)
return@withContext generateData()
}
observer.provideData(data)
}
fun generateData(): MutableList<String>{
val data = mutableListOf<String>()
for(i in 0..1000)
data.add(i.toString())
return data
}
}
Результат передаю во вью через биндинг+liveData
Пожалуйста подскажите насколько такой подход верен ибо читая статьи понял что вроде и принцип единственной ответственности соблюдается и протестить можно и код читабельный. Есть еще мысль обернуть все useCase(interactors) в класс в котором будут execute методы для каждого из них чтобы легче инжектить было
используя viewModelScope избавлюсь от возможных утечек ибо все в скоупе все куротины отменяются при разрушении viewModel