在我的应用程序中,我使用RxJava2和Architecture Components ViewModel中的新类。在我的情况下,我需要将SQL子句推送到ViewModel,它将执行一些魔术并返回Observable,它将为我提供所需的数据。一切正常,但我不确定我是否以最佳方式使用RX。
我的数据流: ViewModel有PublishSubject,我正在推动SQL。 ViewModel还有Observable,它是通过映射主题创建的。另外,我在Subject上使用了distinctUntilChanged,以防止再次执行相同的查询。 为了缓存数据,我在Observable上使用了replay(1).autoconnect(1),但这种方法有一个缺陷。有时,当Observable还没有连接时,我的主题推送了Sql,而我的数据从未到达过我。我应该使用BehaviourSubject吗?或许我不应该首先使用重播(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) })
答案 0 :(得分:0)
在你的情况下,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()
。主题在数据被推送到同一线程时发出,并且不考虑它订阅的线程。