如何结合RxBinding textView和PublicSubject?

时间:2017-05-09 20:18:13

标签: android rx-java2 rx-binding

我是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之外。

1 个答案:

答案 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数据