如何结合 RxBinding textView 和 PublicSubject?

How to combine RxBinding textView and PublicSubject?

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

所以我用了

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

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

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

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

有什么方法可以加入 textChanges Observable 和请求 Subject 吗?换句话说,textChanges 流如何在搜索主题流中继续?。除了在 Next 上从文本可观察对象订阅者调用 mPublishSubject.onNext 之外。

如果我理解正确,您希望通过从 TextView 映射每个用户文本按键来触发请求,或者通过您在某个点独立于按键的显式调用来触发请求。

你需要创建两个请求触发器流,一个是 RxTextView observable,另一个是 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 旧数据。