0

在我的应用程序中,我使用 RxJava2 和 Architecture Components ViewModel 中的新类。在我的例子中,我需要将 SQL 子句推送到 ViewModel,它会做一些魔术并返回 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) })
4

1 回答 1

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(). 主题在数据推送到它的同一线程上发出,并且不考虑它订阅的线程。

于 2018-02-25T08:16:37.267 回答