в Android MVVM, сколько репозиториев и сетевых клиентов мне нужно создать для обслуживания различных запросов?

Я новичок в использовании MVVM и архитектуры Android, и я немного смущен.

скажем, например, я хочу создать такое приложение, как Youtube, поскольку вы знаете, что у YouTube есть эти вкладки в нижней части навигации: Главная, Подписка, Тенденции (исследовать)

эти 3 вкладки будут отображать повторный просмотр элементов (видеообъект), эти 3 будут отображать данные из 3 разных запросов.

в MVVM с использованием модели просмотра и живых данных поток данных будет таким

фрагмент ‹- viewModel‹ - репозиторий ‹- клиент

так что для этих трех вкладок у меня будет 3 разных фрагмента, а это также означает, что у меня будет 3 разных viewModels. теперь я не уверен, сколько репозиториев и сетевых клиентов мне нужно иметь

я прав, если у меня только 1 репозиторий и 1 сетевой клиент? сколько репозиториев и клиентов мне нужно иметь?

каждая viewModel будет извлекать liveData из этого VideoRepository кода ниже, и в конечном итоге каждый фрагмент будет наблюдать данные из каждой viewModel

object VideoRepository {

    val homeVideos: LiveData<List<Video>> = VideoRetrofitClient.homeVideos
    val subscriptionVideos: LiveData<List<Video>> = VideoRetrofitClient.subscriptionVideos
    val trendingVideos: LiveData<List<Video>> = VideoRetrofitClient.trendingVideos

    fun searchHomeVideos() {
        VideoRetrofitClient.searchHomeVideos()
    }

    fun searchSubscriptionVideos() {
        VideoRetrofitClient.searchHomeVideos()
    }

    fun searchTrendingVideos() {
        VideoRetrofitClient.searchHomeVideos()
    }

}

и VideoRepository получит LiveData из этого VideoRetrofitClient, как этот код

object VideoRetrofitClient {
    val homeVideos = MutableLiveData<List<Video>>()
    val subscriptionVideos = MutableLiveData<List<Video>>()
    val trendingVideos = MutableLiveData<List<Video>>()


    fun searchHomeVideos() {
        // perform networking ....

        homeVideos.postValue(videos)
    }

    fun searchSubscriptionVideos() {
        // perform networking ....

        subscriptionVideos.postValue(videos)
    }

    fun searchTrendingVideos() {
        // perform networking ....

        trendingVideos.postValue(videos)
    }
}

java или kotlin в порядке




Ответы (2)


Вам нужен репозиторий для каждой модели (данных).

Видеомодель имеет интерфейс VideoRepository.

И ваши репозитории могут быть одним из следующих:

  • InMemoryRepository
  • База данных Репозиторий
  • RemoteRepository

При работе с MVVM сначала подумайте о модели (данных).

  1. У меня есть некоторые данные (видео), которые нужно сохранить, поэтому мне нужна модель для этого.
  2. Мне нужно сохранить эту модель для чтения / записи, поэтому мне нужен репозиторий.
  3. Мой репозиторий должен сохранять / читать из базы данных, поэтому мне нужен VideoDatabaseRepostory
interface VideoRepository {
  fun getVideos(type: VideoType)
  fun getVideo(videoId: Int)
  fun uploadVideo(file: File)
}
class VideoDatabsaeRepository : VideoRepository {

    //Accept Enum to decide whic API ti call.
    fun getVideos(type: VideoType) {
        when (type) {
            FavoriteVideos -> {   }
            RecentVideos -> { }
            ...  
        }
    }

}

В сетевом режиме вам понадобится веб-API, который фильтрует результаты на основе вашего запроса к API.

person Arrow    schedule 15.03.2020
comment
фактический запрос на самом деле находится в бэкэнде, поэтому я просто получаю успокаивающий API из бэкэнда. поэтому мой клиентский код просто получает видеоданные от bakcend. в таком случае, нормально ли (обычная практика) иметь 3 свойства LiveData в одном репозитории, как мой код выше? - person Alexa289; 15.03.2020
comment
если я увижу диаграмму с Android здесь developer.android.com/ topic / libraries / architecture / images / кажется, что репозиторий является центром, решающим, получать ли данные из базы данных комнат или с сервера (дооснащение). поэтому я смущен, когда вы сказали, что ваши репозитории могут быть одним из следующих: InMemoryRepository, DatabaseRepository, RemoteRepository - person Alexa289; 15.03.2020
comment
@ Alexa289 Я обновил свой код, чтобы вы могли использовать перечисление для принятия решения и перенаправления вызова на модернизацию на основе этого. если помогло, не забудьте проверить и + ответить. - person Arrow; 15.03.2020
comment
Извините, я новичок, я не совсем понимаю ваше решение, так сколько LiveData мне нужно сохранить в моем репозитории? 3 разных видео liveata, как мой репозиторий? - person Alexa289; 18.03.2020
comment
У меня есть 3 вида видео: домашнее видео, популярное видео и видео по подписке. мне нужно только 1 живые данные для передачи списка видео во фрагмент / активность в моем единственном репозитории? или мне нужно сделать 3 живые данные в одном моем репозитории? - person Alexa289; 18.03.2020
comment
@ Alexa289 Вы можете использовать одну LiveData с 3 преобразованиями, чтобы сопоставить их с отдельными наблюдателями. - person Arrow; 18.03.2020

Прежде всего, в своем запросе вы можете их различать, передав параметр, который может быть перечислимым типом. тогда вы можете вызвать только один метод репозитория, просто передав другой тип в параметре. Если это невозможно, вам нужно создать три разных запроса для репозитория также в клиенте.

person Rashed Khan    schedule 15.03.2020
comment
фактический запрос на самом деле находится в бэкэнде, поэтому я просто получаю успокаивающий API из бэкэнда. поэтому мой клиентский код просто получает видеоданные от bakcend. в этом случае нормально (обычная практика) иметь 3 свойства LiveData в одном репозитории, как мой код выше? - person Alexa289; 15.03.2020