首页 > 解决方案 > 使用 Room 实时查询进行生命周期状态管理

问题描述

我对三种状态有看法:

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)
}

这些状态包含在 a 中MutableLiveData并由 a 管理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>>
}

标签: androidandroid-roomandroid-lifecycleandroid-livedata

解决方案


如果你已经为 Room 安装了 RxJava2 支持,我会考虑如下:

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>or Observable<MainState>


推荐阅读