в Android MVVM, сколько репозиториев и сетевых клиентов мне нужно сделать для обслуживания разных запросов? - PullRequest
1 голос
/ 15 марта 2020

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

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

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

в MVVM с использованием viewmodel и livingata поток данных будет выглядеть следующим образом:

фрагмент <- viewModel <- хранилище <- client </p>

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

Прав ли я, если у меня есть только 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 ]

0 голосов
/ 15 марта 2020

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

0 голосов
/ 15 марта 2020

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

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

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

  • InMemoryRepository
  • DatabaseRepository
  • 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...