我有一个具有三种状态的视图:
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>>
}
答案 0 :(得分:1)
如果您已经安装了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>
或Observable<MainState>
。
答案 1 :(得分:0)
可以使用MediatorLiveData来完成。
LiveData子类,可以观察其他LiveData对象并做出反应 它们中的OnChanged事件。
解决方案如下:
val stateLiveData = MediatorLiveData<MainState>()
init {
stateLiveData.addSource(movieRepo.getAllMovies()) {
stateLiveData.value = Success(it)
}
}
有关更多信息,请选中此出色的post