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

标签 java android rx-java2

我是 Android 开发新手,目前正在尝试制作一个与 Rest API 配合使用的简单 MVC 应用程序。 API 调用是在不使用 Retrofit 的情况下进行的,尽管这并不那么重要。主要问题是,使用带有 debounce 和 SwitchMap 的 Observable 我仍然收到太多 API 调用(并且应该丢弃多余的 API 调用)。输入文本时调用该函数(带有 TextWatcher 的 EditText Listener)。当连续无延迟地管理单词时,服务器处理的每个符号仅应在不在 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();

每当文本更改时都会发出输入的文本/查询。在回调中使用它:

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

并在你的主函数中,订阅可观察的:

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 有助于减少同一查询的处理。

关于java - 如何在我的代码中使用 SwitchMap (RXJAVA)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57968266/

相关文章:

android - Schedulers.io() 在我的单元测试中抛出 NullPointerException

android - 通过改造在网络调用上返回 Observable

java - Spring AOP切点错误

java - Eclipse Checkstyle 插件中 "allowThrowsTagsForSubclasses"问题的解决方法

java - 在 Java 8 中对具有聚合的多个字段进行分组

java - 已签名的 APK 具有不同的 Facebook key 哈希

java - 当 2 个条件为 true 时从 JSON 获取值

java - snmp 中 1.3.6.1.2.1.43.11.1.1.5.1.1 3 ) 的含义是什么?

java - TextView 不在主屏幕上打印字符串

rx-java - RxJava 2-Observable.flatMapSingle澄清