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