Инкрементальный поиск в Android с использованием библиотеки Volley?

Я как-то реализовал добавочный поиск в Android с помощью AsyncTask. В инкрементном поиске API вызывается для каждого символа, введенного в тексте редактирования, для получения предложений от сервера. Например,

User types a -> API is called.
User types ab -> API is called.
User types abc -> API is called. 

Это делает три вызова API для a, ab и abc соответственно. Если пользователь все еще печатает, то все предыдущие запросы (например, запросы a и ab) будут отменены, а последний запрос (abc) будет обслуживаться только во избежание задержек.

Теперь я хочу реализовать это, используя библиотеку Volley для лучшей производительности. Может ли кто-нибудь помочь мне, как я могу достичь этой функциональности, используя залп, особенно механизм отмены всех предыдущих запросов и обслуживать последний запрос только для получения предложений от сервера.

ПРИМЕЧАНИЕ: я не мог найти в связи с этим, поэтому размещать его здесь. Пожалуйста, направляйте меня, потому что я новичок в Android и действительно нуждаюсь в ответе.

1 ответ

Сначала вам нужно реализовать TextWatcher слушать изменения в редактируемом тексте. В зависимости от требования измененного текста вы отменяете и добавляете запрос в очередь.

private RequestQueue queue = VolleyUtils.getRequestQueue();


private static final String VOLLEY_TAG = "VT";
private EditText editText;
...

 TextWatcher textChangedListener = new TextWatcher() {

          @Override
          public void afterTextChanged(Editable s) {}

          @Override
          public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

          @Override
          public void onTextChanged(CharSequence s, int start, int before, int count) {

            if (s.length() != 0) {
                // first cancel the current request with that tag
                queue.cancelAll(VOLLEY_TAG);
                // and then add a new one to queue
                StringRequest stringRequest = 
                     new StringRequest("http://blabla/servlet?param=" + s, 
                     new Listener<String>() {
                       // request callbacks
                     };
                stringRequest.setTag(VOLLEY_TAG);
                queue.add(stringRequest);
            } 
        }
  };

editText.addTextChangedListener(textChangedListener);

Просто помните, что этот дизайн будет поглощать пропускную способность. Лучше использовать Handler.post() подождать несколько секунд, прежде чем отправить запрос.

Другие вопросы по тегам