我将如何在我的代码中使用 SwitchMap (RXJAVA)?

How I would use SwitchMap (RXJAVA) in my code?

我是 Android 开发的新手,目前正在尝试制作一个可与 Rest API 一起使用的简单 MVC 应用程序。 API 调用是在不使用 Retrofit 的情况下进行的,尽管这并不是那么重要。主要的问题是,将 Observable 与 debounce 和 SwitchMap 结合使用时,我仍然会收到太多 API 调用(并且应该丢弃多余的调用)。输入文本时调用该函数(带有 TextWatcher 的 EditText 侦听器)。并且在没有延迟字的情况下连续管理时,服务器处理的每个符号只应在不在 600 毫秒内时管理。请帮助我。

public Observable<String> getObservable(final String s){
    return  Observable
            .create(new ObservableOnSubscribe<String>() {
        @Override
        public void subscribe(ObservableEmitter<String> emitter) throws Exception {
            emitter.onNext(model.translateText(s));
        }
    });
}

public Observer<String> observer = new Observer<String>() {
    @Override
    public void onSubscribe(Disposable d) {

    }

    @Override
    public void onNext(String s) {
        mainView.hideProgress();
        mainView.showResult(s);
    }

    @Override
    public void onError(Throwable e) {

    }

    @Override
    public void onComplete() {

    }
};


public void onEditTextChange(String textForTranslate){
    mainView.showProgress();
    getObservable(textForTranslate)
            .debounce(600,TimeUnit.MILLISECONDS)
            .switchMap(new Function<String, ObservableSource<String>>() {
                @Override
                public ObservableSource<String> apply(String s) throws Exception {
                    return Observable.just(s);
                }
            })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(observer);
}

每次键入一个字符时,您都会创建一个新的可观察对象。因此创建了多个观察者,每个观察者都有单独的去抖动(时间限制)和切换,但它们没有被重复使用。相反,只要文本更改并在其上启动 rx 链,您就会创建一个新的可观察对象。

您需要创建一个 PublishSubject

private final PublishSubject<String> querySubject = PublishSubject.create();

每当文本更改时发出 entered text/query。在回调中使用它:

public void onEditTextChange(String textForTranslate) {
    querySubject.onNext(textForTranslate);
}

并且在你的主函数中,订阅 observable:

querySubject
        .debounce(600, TimeUnit.MILLISECONDS)
        .distinctUntilChanged()
        .switchMap(new Function<String, ObservableSource<String>>() {
            @Override
            public ObservableSource<String> apply(String s) throws Exception {
                  //  perform api call or any other operation here
                  return Observable.just(s);
               }
            })
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(observer);

Debounce 运算符仅在给定时间(600 毫秒)过去后才发出单个项目。如果正在处理当前项目并且给定时间尚未过去,它会忽略项目。 distinctUntilChanged 有助于减少对同一查询的处理。