0

我是 RxJava 的新手。我想要完成的是搜索功能,每次按键都是一个请求。我也希望能够明确地调用请求。

所以我用

RxTextView.textChanges(editText) .debounce .flatmap(request)第一部分。一切正常。

但是当手动调用请求部分时,我卡住了。我可以通过执行 editText.setText(editText.getText) 解决它来隐式触发 onTextChange ,但这感觉很脏。

我研究了该主题并找到了 PublishSubject。我提取了其中的实际请求部分,看起来有点像这样

mPublishSubject.
.doOnNext(.. show progressbars..)
.flatMap(..request..)
.subscribe(.. display data...)

有没有办法可以加入 textChanges Observable 和请求主题?换句话说,textChanges 流如何在搜索主题流中继续?除了从文本 observables 订阅者 onNext 调用 mPublishSubject.onNext 之外。

4

1 回答 1

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。

于 2017-05-10T05:09:44.473 回答