使用ViewModel和RxJava2在Android中缓存数据的最佳方法

时间:2018-02-24 20:17:24

标签: android kotlin rx-java2 rx-kotlin

在我的应用程序中,我使用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) })

1 个答案:

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