我正在尝试用android-query库实现搜索自动补全
我的Activity中有回调示例:
回电:
class SearchCompleteCallback extends AjaxCallback<ItemSearchResult> {
public void callback(String url, ItemSearchResult searchResult, AjaxStatus status) {
Log.d("SCB", String.format("Url:%s\n Msg: %s\n Code: %s\n Error: %s",
url,
status.getMessage(),
status.getCode(),
status.getError()));
if (searchResult != null) {
Log.d("SCB", String.format("Status: %s\n Val: %s",
searchResult.getStatus(),
searchResult.getInnGroup().getItems()));
updateSearchResult(searchResult);
}
else {
Log.w("SCB", "Ajax failed");
}
}
}
检索例程,调用文本变更:
private void doSearch(String query) {
ppApi.getSearchResult(query, searchCompleteListener);
}
以及
API类
public class PPServerApi {
private AQuery aq;
private GsonTransformer transformer;
private static class GsonTransformer implements Transformer{
public <T> T transform(String url, Class<T> type, String encoding, byte[] data, AjaxStatus status) {
Gson g = new Gson();
return g.fromJson(new String(data), type);
}
}
public PPServerApi(AQuery newAq){
aq = newAq;
transformer = new GsonTransformer();
AQUtility.setDebug(true);
AjaxCallback.setTransformer(transformer);
}
public void getSearchResult(String itemName, AjaxCallback<ItemSearchResult> cb){
String url = "http://my.api.server/search?q=" + itemName;
aq.ajax(url, ItemSearchResult.class, cb.header("content-type", "application/json"));
}
}
所以,问题是如何在发送新查询之前中止旧查询?
(我不需要旧查询的结果,如果在搜索字段中的文本发生变化)
我尝试在doSearch()中调用searchCompleteListener.abort(),但它在下一个查询中导致异常:
08-09 20:59:10.551: W/AQuery(6854): get:http://my.api.server/search?q=abc
08-09 20:59:10.551: W/AQuery(6854): creating http client
08-09 20:59:10.561: W/AQuery(6854): java.io.IOException: Aborted
08-09 20:59:10.561: W/AQuery(6854): at com.androidquery.callback.AbstractAjaxCallback.httpDo(AbstractAjaxCallback.java:1569)
...
因此,在这种情况下,我甚至不能执行单个查询。
4条答案
按热度按时间0qx6xfy61#
没有办法让android-query取消一个已经启动的 AJAX 请求。抱歉,你必须使用另一个库。
你能做的是检查请求完成时是否已经过时。
您可以通过检查URL是否与您请求的最新URL匹配来执行此操作
(note,你必须让getSearchResult返回URL)
brccelvz2#
你可以使用我的droidQuery库。使用 droidQuery,你可以使用调用取消所有 AJAX 任务:
您也可以使用以下命令执行您的请求:
enxuqcxy3#
您可以使用此命令中止任何查询处理。
有关更多信息,您可以查看此链接https://laaptu.wordpress.com/tag/android-cancelling-aquery/
rqcrx0a64#
只需调用aq.ajaxCancel()以了解更多细节,请参阅API文档
http://android-query.googlecode.com/svn/trunk/javadoc/com/androidquery/AbstractAQuery.html#ajaxCancel()