Инкрементальный поиск в 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()
подождать несколько секунд, прежде чем отправить запрос.