我是RxJava的新手。 我想要完成的是搜索功能,每次按键都是一个请求。此外,我希望能够明确地调用请求。
所以我用了
PlayKeys.devSettings := Seq(
"https.port" -> "9443",
"play.server.https.keyStore.path" -> "conf/keystore.jks"
)
第一部分。一切正常。
但是当手动调用请求部分时,我卡住了。我可以通过执行editText.setText(editText.getText)来解决它触发onTextChange,但感觉很脏。
我研究了这个主题,发现了PublishSubject。我在其中提取了执行请求部分,看起来有点像这样
RxTextView.textChanges(editText)
.debounce
.flatmap(request)
有没有办法可以加入textChanges Observable和请求主题?换句话说,textChanges流如何在搜索主题流中继续?除了从文本observables订阅者onNext调用mPublishSubject.onNext之外。
答案 0 :(得分:3)
如果我理解正确,您可以通过映射每个用户文本按键来TextView
,或者通过您在独立于按键的某个时刻显式调用来激活请求。
您需要创建两个请求触发器流,一个是RxTextView
可观察的,另一个是PublishSubject
,就像您建议的那样,会发出一个值(文本字符串) )根据您的要求。然后合并这两个流来获得一个发出文本的流,并发出一个事件来响应文本发射,如下所示:
Observable.merge(
RxTextView.textChanges(editText)
.debounce(DEBOUNCE_VALUE, TimeUnit.MILLISECONDS),
mPublishSubject)
.flatMap(text -> fireRequest(text))
.subscribe(...);
为了手动触发请求,您可以使用以下方法:
private void manualRequestTrigger(String text) {
mPublishSubject.onNext(text);
}
您还应该考虑使用concatMap
而不是flatMap
,因为flatMap会以非订购方式发出请求结果,因此旧请求可以在较新的请求后完成,并且您将使用旧版更新UI数据