可使用 autoCompleteTextView android 进行观察



我正在使用AutoCompleteTextView的实现,其中建议是从webapi获取并根据用户输入显示的。我正在使用改造客户端进行网络连接和可观察的响应,如果两个请求一个接一个地从客户端发送,可观察如何处理响应,以便在客户端只处理最后一个响应。

我现在无法发布我的代码,但是如果出现问题,我会发布它。

我更关心响应,例如假设用户键入一个字符并在特定时间间隔后发送请求以获取建议,然后客户端可以收到响应(延迟可能是由于服务器端的任何原因(用户键入下一个字符,因此请求将被发送以获取新的建议列表。我的要求是,第一个请求的响应应无效,仅应考虑最新响应。

您应该使用去抖动,因为去抖动会给出最新发出的可观察值,它会在指定的时间后发出,并将其与发布主题相结合会给你一个 +

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());
}
});

优雅地处理此问题的一种方法是使用去抖动。我假设您已经知道如何从AutoCompleteTextView中制作可观察的内容。

假设您有这个可观察autoCompleteTvObservable

autoCompleteTvObservable.filter((it)-> it.length() >= 2)
.debounce(1000, TimeUnit.MILLISECONDS);

上面的过滤器只是过滤 TextWatcher,以便它仅在输入文本的长度大于或等于 2 时才触发,然后去抖动将等待 1 秒,然后使用最后一个输入的文本执行可观察量。

这样,您可以确保仅查询输入的最新版本。

我通过实现autoCompleteTextView类并通过以下代码覆盖performanceFilter来处理延迟。

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 的实现中创建的对象,用于处理请求。

最新更新