android - 使用 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>>
}
解决方案
如果你已经为 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>
。
推荐阅读
- angularjs - 如何滑下 AngularJS 的旧烤面包机
- javascript - 异步/等待似乎不起作用
- c# - FOR循环初始化中的多个语句
- c - 使用 SCM_TIMESTAMP 在 macOS 上启用 UDP 数据包时间戳
- c++ - 将私有矩阵形式 int 转换为 double c++
- javascript - 提交验证错误的 Max 和 Step
- vue.js - 为什么在 vue-cli 中运行“build -mode development”时无法缓存构建文件?
- php - 如何在没有 var_dump() 的情况下检查 NULL 值?PHP
- php - 如何在 laradock 中将数据库名称从默认更改为自定义?
- android - 无法解析 org.tensorflow:tensorflow-lite:0.0.0-nightly