Управление состоянием жизненного цикла с помощью комнатных запросов - PullRequest
0 голосов
/ 11 января 2019

У меня есть три состояния:

sealed class MainState(val movieList: List<Movie>) {
    class Loading(movies: List<Movie> = emptyList()) : MainState(movies)
    class Success(movies: List<Movie>) : MainState(movies)
    class Error(val throwable: Throwable, movies: List<Movie> = emptyList()) : MainState(movies)
}

Эти состояния заключены в MutableLiveData и управляются ViewModel:

class MovieListViewModel(private val movieRepo: MovieRepository) : ViewModel() {
    val stateLiveData = MutableLiveData<MainState>()
    .
    .
}

Я хочу интегрировать запрос liveData с моим состоянием liveDate, чтобы при обновлении запроса liveData до movieList состояние liveData обновлялось до Success(movieList). Как я могу достичь этого?

Вот как выглядит мой живой запрос:

@Dao
interface MovieDAO {
@Query("SELECT * FROM Movie")
   fun getAllMovies(): LiveData<List<Movie>>
}

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Если вы установили поддержку RxJava2 для Room, я рассмотрю следующее:

val stateLiveData = MutableLiveData<MainState>()

dao().getAllMovies()
     .subscribeOn(Schedulers.io())
     .observeOn(AndroidSchedulers.mainThread())
     .doOnSubscribe(() -> stateLiveData.value = Loading(emptyList()))
     .subscribeBy(
         onNext = { stateLiveData.value = Success(it) }
         onError { stateLiveData(it, emptyList()) }         
      )

Конечно, вам нужно изменить тип возврата запроса Room на Flowable<MainState> или Observable<MainState>.

0 голосов
/ 11 января 2019

Это можно сделать с использованием MediatorLiveData .

Подкласс LiveData, который может наблюдать другие объекты LiveData и реагировать на OnChanged событиях от них.

Решение выглядит так:

    val stateLiveData = MediatorLiveData<MainState>()

    init {
        stateLiveData.addSource(movieRepo.getAllMovies()) {
            stateLiveData.value = Success(it)
        }
    }

Для получения дополнительной информации, пожалуйста, проверьте этот великий сообщение

...