LiveData из комнаты и MutableLiveData для отображения сообщения об ошибке - PullRequest
0 голосов
/ 28 мая 2020

Исходный код можно найти по адресу: https://github.com/Ali-Rezaei/TVMaze

У меня есть следующий класс репозитория:

class ShowRepository(
    private val showDao: ShowDao,
    private val api: TVMazeService
) {

    /**
     * A list of shows that can be shown on the screen.
     */
    val shows: LiveData<List<Show>> =
        Transformations.map(showDao.getShows()) {
            it.asDomainModel()
        }

    /**
     * Refresh the shows stored in the offline cache.
     */
    suspend fun refreshShows(): Result<List<Show>> = withContext(Dispatchers.IO) {
        try {
            val news = api.fetchShowList().await()
            showDao.insertAll(*news.asDatabaseModel())
            Result.Success(news)
        } catch (err: HttpException) {
            Result.Error(err)
        }
    }
}

Насколько я понимаю, Room не поддерживает MutableLiveData, а поддержка LiveData. Итак, я создал два объекта в моей ViewModel, которые нужно наблюдать:

class MainViewModel(
    private val repository: ShowRepository,
    app: Application
) : AndroidViewModel(app) {

    private val _shows = repository.shows
    val shows: LiveData<List<Show>>
        get() = _shows

    private val _liveData = MutableLiveData<Result<List<Show>>>()
    val liveData: LiveData<Result<List<Show>>>
        get() = _liveData

    /**
     * init{} is called immediately when this ViewModel is created.
     */
    init {
        if (isNetworkAvailable(app)) {
            viewModelScope.launch {
                _liveData.postValue(repository.refreshShows())
            }
        }
    }
}

Я использую show LiveData varialbe для отправки списка в моем Activity:

viewModel.shows.observe(this, Observer { shows ->
            viewModelAdapter.submitList(shows)
        })

И я использую LiveData переменная для отображения сообщения об ошибке при возникновении исключения в refreshShows() репозитория:

viewModel.liveData.observe(this, Observer { result ->
            if (result is Result.Error) {
                Toast.makeText(this, getString(R.string.failed_loading_msg), Toast.LENGTH_LONG).show()
                Timber.e(result.exception)
            }
        })

Как вы думаете, есть ли лучшее решение - иметь одну LiveData в ViewModel, а не две?

1 Ответ

0 голосов
/ 28 мая 2020

Я думаю, вы можете улучшить код ur, используя это репо в качестве основы. Он использует стратегию единого источника истины с использованием живых данных. Я думаю, вам придется немного покопаться в репо, чтобы понять код, но, чтобы подвести итог, этот код будет получать данные из api, хранить в комнате ur и в результате предоставлять ответ на запрос комнаты ur, поэтому наблюдение за этим будет делать все это.

...