Во-первых, я настоятельно рекомендую прочитать SOLID Принципы дяди Боба, чтобы понять, почему код разделен, если вы этого еще не сделали.
Обычная практика - использовать шаблон репозитория, предложенный в Android Документация. Вот справочник по архитектуре: Android Справочник по компонентам архитектуры
Я разбил, какова роль каждого блока ниже:
Activity / Фрагмент : Здесь вы делаете все, что связано с вашими представлениями, например, инициализируете RecyclerView, демонстрируете диалоги, фрагментируете транзакции, показывает тосты et c. Здесь вы также зарегистрируете Observers для MutableLiveData (который присутствует в вашей ViewModel)
ViewModel : ViewModel содержит все бизнес-логи c, которые относятся к представлению , ViewModel не несет ответственности за инициализацию вызовов API. Причина в том, что, возможно, может возникнуть сценарий, когда вам потребуется дополнительная обработка ответа и, возможно, его сохранение в БД или даже выборка данных из БД в случае ошибки в API.
Однако вы можете вызвать API, используя экземпляр репозитория, который содержит все детали выполнения API. Как только ответ получен, присвойте значение в liveata в вашей модели просмотра, которое наблюдает наблюдатель, зарегистрированный во фрагменте / действии.
Репозиторий : Обычно здесь выполняются все сетевые операции и операции с базой данных. Это учитывает ответственность за выборку всех данных, которые должны быть отделены от ViewModel.
Вот краткий краткий пример
class UserViewModel(private val imageRepository) : ViewModel() {
//Not required since you're using a Single which uses a SingleObserver that doesn't require to be disposed manually.
private val cd = CompositeDisposable()
val responseImages = MutableLiveData<ResponseImages>()
val showError = MutableLiveData<Boolean>()
fun getImages(text: String) =
imageRepository.getImages(text)
.observerOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe({
responseImages.value = (it)
}, {
showError.value = true
})
override fun onCleared() {
cd.dispose()
super.onCleared()
}
fun callCleared() {
onCleared()
}
}
//Note: you should ideally just pass the API instance. unless required.
class ImageRepository(val retrofitHelper: RetrofitHelper){
fun getImages(text:String): Single<ResponseImages> {
return retrofitHelper.apiInstance.getImages(Site.Method,Site.key,text)
}
}
//In your Activities onCreate()
class HomeActivity: AppCompatActivity(){
override fun onCreate(bundle: SavedInstanceState?){
viewModel.responseImages.observer(this,Observer {
//do something with your ResponseImages
}
}
}
Есть и другие вещи, которые можно сделать, например, использовать шаблон стратегии для своего репозитория, где ImageRepository является интерфейсом, а ImageRepositoryImpl содержит все подробности. и др c. Но это в другой раз!
SunflowerApp от Google - отличный справочник:)