我将如何在我的代码中使用 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
有助于减少对同一查询的处理。
我是 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
有助于减少对同一查询的处理。