我正在使用AutoCompleteTextView的实现,其中从webapi提取建议并根据用户输入显示建议。我正在使用改造客户端来建立网络连接,并且可观察到响应,如果两个请求接连发送,那么可观察性如何处理响应,以便仅在客户端处理最后一个响应。
我现在无法发布我的代码,但是如果出现问题,我会发布它。
我更关心响应,例如假设用户键入一个字符,并在特定时间间隔后发送请求建议,然后才可以在客户端接收响应(延迟可能是由于服务器端的任何原因)。用户键入下一个字符因此该请求将被发送以获取新的建议列表。我的要求是,来自第一个请求的响应应该无效,并且仅应考虑最新的响应。
答案 0 :(得分:0)
一种解决此问题的方法是使用反跳。我假设您已经知道如何通过AutoCompleteTextView
进行观测。
假设您有这个可观察的autoCompleteTvObservable
。
autoCompleteTvObservable.filter((it)-> it.length() >= 2)
.debounce(1000, TimeUnit.MILLISECONDS);
上面的过滤器只是对TextWatcher进行过滤,以便仅在输入文本的长度大于或等于2时才会触发,然后反跳将等待1秒钟,然后对最后输入的文本执行可见的操作。 >
以此,您可以确保仅查询输入的最新版本。
答案 1 :(得分:0)
您应该使用debounce,因为debounce将提供最新的发射观测值,并且它将在指定的时间后发射,并将其与发布主题组合会给您+
PublishSubject<String> subject;
subject = PublishSubject.create();
subject.debounce(100, TimeUnit.MILLISECONDS)
.onBackpressureLatest()
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
// Whatever processing on user String
}
});
autoCompleteTextView.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) { }
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
public void onTextChanged(CharSequence s, int start, int before, int count) {
subject.onNext(s.toString());
}
});
答案 2 :(得分:0)
我通过实现autoCompleteTextView类并通过以下代码覆盖performFiltering来处理延迟。
private val MESSAGE_TEXT_CHANGED = 100
private val DEFAULT_AUTOCOMPLETE_DELAY:Long = 3000
override fun performFiltering(text: CharSequence?, keyCode: Int) {
mLoadingIndicator.visibility = View.VISIBLE
super.performFiltering(text, keyCode)
mHandler.removeMessages(MESSAGE_TEXT_CHANGED)
mHandler.sendMessageDelayed(mHandler.obtainMessage(MESSAGE_TEXT_CHANGED,
text), mAutoCompleteDelay)
}
mHandler是在autoCompleteTextView的实现中创建的用于处理请求的对象。