Rx java 将热可见光转换为冷可见光

Rx java 将热可见光转换为冷可见光,rx-java,Rx Java,我正在用RxJava观察一个数据库表。所有SQL SELECT查询都返回一个热可观测值,每当我在同一个表中插入/更新/删除行时,我都会重新运行任何已订阅的SELECT查询,并在热可观测值查询上调用onNext(queryResult) database.select("SELECT * FROM Foo) // returns an observable .map(doSomething) .filter(aFilter) .subscribe (

我正在用RxJava观察一个数据库表。所有SQL SELECT查询都返回一个热可观测值,每当我在同一个表中插入/更新/删除行时,我都会重新运行任何已订阅的SELECT查询,并在热可观测值查询上调用
onNext(queryResult)

database.select("SELECT * FROM Foo) // returns an observable
       .map(doSomething)
       .filter(aFilter)
       .subscribe (
             { 
                 //  onNext
             },
             {
                // onError
             }
          )
这很有效。然而,在一个特殊用例中,我希望避免数据库重新发出一个新项。我是否可以使用某种运算符使其成为单个“冷”可观察对象,而不必更改我为热可观察对象构建的所有数据库层,如:

database.select("SELECT * FROM Foo) // returns an observable
           .map(doSomething)
           .filter(aFilter)
           .toColdObservable()
           .subscribe (
                 { 
                     //  onNext
                 },
                 {
                    // onError
                 }
              )

我知道“冷观测”这个词不合适,但我还没有找到更好的名字。因此,我想要的是,数据库不会通知SQL查询可观察到的更新。因此,我所说的“cold observable”只是查询数据库一次,之后不再接收更新。

如果您不想收到通知,可以使用一个空的,有效地忽略结果:

订阅可观察到的,但忽略其发射和通知


将热观测值转换为冷观测值有两种主要方法:
defer
完全延迟其存在,或
replay
+
autoConnect(0)
预先运行它,并将其作为冷观测值重放给其他观测值

但是,此
select
的通知方案意味着它永远不会完成,因此您需要应用某种
timeout
,以便在大小上限制重播


我还要检查库是否真的支持一次性运行(冷)查询,而您没有这个问题;每个订户将运行一个新的有限查询。否则,这可能是一个很好的功能要求。

简单的
take(1)
怎么样?这将在第一个结果之后完成可观察的查询。

根据您的描述,我想知道如何
select()
可能有效:返回一些
行为主题
发布主题
,同时安排对数据库的异步查询,同时确保此查询不会在当前客户端实际订阅之前开始将项目推送到主题中?是的,最明显的问题并没有立即出现在我的脑海中。所以我的解决方案是@akarnokd和
take(1)
database.select("SELECT * FROM Foo") // returns an observable
           .map(doSomething)
           .filter(aFilter)
           .subscribe ()