gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:36:50 25 4
gpt4 key购买 nike

我是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com