用autoCompleteTextView android可观察到

时间:2018-06-27 00:57:13

标签: android

我正在使用AutoCompleteTextView的实现,其中从webapi提取建议并根据用户输入显示建议。我正在使用改造客户端来建立网络连接,并且可观察到响应,如果两个请求接连发送,那么可观察性如何处理响应,以便仅在客户端处理最后一个响应。

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

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

3 个答案:

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