使用 ViewModel 和 RxJava2 在 Android 中缓存数据的最佳方式
Best way to cache data in Android with ViewModel and RxJava2
在我的应用程序中,我使用了 RxJava2 和 Architecture Components ViewModel 中的新 class。在我的例子中,我需要将 SQL 子句推送到 ViewModel,这会产生一些魔力,而 return Observable 会为我提供我需要的数据。一切正常,但我不确定我是否以最佳方式使用 RX。
我的数据流:
ViewModel 有 PublishSubject,我正在推动 SQL。 ViewModel 也有 Observable,它是由映射对象创建的。另外,我在 Subject 上使用了 distinctUntilChanged,以防止再次执行相同的查询。
为了缓存数据,我在 Observable 上使用了 replay(1).autoconnect(1),但这种方法有一个缺陷。有时,当 Observable 尚未连接时,我的 Subject 推送 Sql,而我的数据从未到达我这里。我应该使用 BehaviourSubject 吗?或者也许我不应该首先使用 replay(1).autoconnect(1) ?或者也许我的整个流程是错误的?示例:
val listSubject: Subject<RawSql> = PublishSubject.create()
val sqlListEmitter: Observable<List<T>> =
listSubject
.subscribeOn(Schedulers.computation())
.map { // SOME MAGIC HERE }
.replay(1).autoConnect(1, { compositeDisposable.add(it) })
在你的情况下 autoConnect()
只是等待第一个订阅 connect()
到你的流。由于您的主题和您的流构建了一个固有的实体,您可能根本不想等待它,而是直接连接它。
val listSubject: Subject<RawSql> = PublishSubject.create()
val sqlListEmitter: Observable<List<T>> =
listSubject
.observeOn(Schedulers.computation())
.map { // SOME MAGIC HERE }
.replay(1)
.let {
it.connect(compositeDisposable::add)
it.publish()
}
您可能还需要将 subscribeOn()
更改为 observeOn()
。主题在将数据推送到它的同一线程上发出,并且不考虑它订阅的线程。
在我的应用程序中,我使用了 RxJava2 和 Architecture Components ViewModel 中的新 class。在我的例子中,我需要将 SQL 子句推送到 ViewModel,这会产生一些魔力,而 return Observable 会为我提供我需要的数据。一切正常,但我不确定我是否以最佳方式使用 RX。
我的数据流: ViewModel 有 PublishSubject,我正在推动 SQL。 ViewModel 也有 Observable,它是由映射对象创建的。另外,我在 Subject 上使用了 distinctUntilChanged,以防止再次执行相同的查询。 为了缓存数据,我在 Observable 上使用了 replay(1).autoconnect(1),但这种方法有一个缺陷。有时,当 Observable 尚未连接时,我的 Subject 推送 Sql,而我的数据从未到达我这里。我应该使用 BehaviourSubject 吗?或者也许我不应该首先使用 replay(1).autoconnect(1) ?或者也许我的整个流程是错误的?示例:
val listSubject: Subject<RawSql> = PublishSubject.create()
val sqlListEmitter: Observable<List<T>> =
listSubject
.subscribeOn(Schedulers.computation())
.map { // SOME MAGIC HERE }
.replay(1).autoConnect(1, { compositeDisposable.add(it) })
在你的情况下 autoConnect()
只是等待第一个订阅 connect()
到你的流。由于您的主题和您的流构建了一个固有的实体,您可能根本不想等待它,而是直接连接它。
val listSubject: Subject<RawSql> = PublishSubject.create()
val sqlListEmitter: Observable<List<T>> =
listSubject
.observeOn(Schedulers.computation())
.map { // SOME MAGIC HERE }
.replay(1)
.let {
it.connect(compositeDisposable::add)
it.publish()
}
您可能还需要将 subscribeOn()
更改为 observeOn()
。主题在将数据推送到它的同一线程上发出,并且不考虑它订阅的线程。