我已经在某种程度上使用AsyncTask在android中实现了增量搜索。在增量搜索中,为编辑文本中输入的每个字符调用API以从服务器获取建议。例如,
User types a -> API is called.
User types ab -> API is called.
User types abc -> API is called.
这分别为a,ab和abc进行三次API调用。如果用户仍在键入,则所有先前的请求(例如a和ab的请求)将被取消,并且最后的请求(abc)将仅用于避免延迟。
现在我想使用Volley库实现这一功能,以获得更好的性能。任何人都可以帮助我如何使用volley实现此功能,特别是取消所有先前请求的机制,并提供最后一个请求,仅从服务器获取建议。
注意:我无法找到关于这一点的原因。请指导我,因为我是android新手,真的需要回答。
答案 0 :(得分: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()
等待几秒钟。