使用Volley库在android中进行增量搜索?

时间:2015-05-15 05:07:13

标签: android android-asynctask android-volley incremental-search

我已经在某种程度上使用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新手,真的需要回答。

1 个答案:

答案 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()等待几秒钟。