我正在尝试用android查询库实现搜索自动完成。
我的活动中有回调实例:
回调:
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);
} 和
APIClass
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"));
}
} 那么,问题是如何在发送新查询之前中止旧的查询?
(如果搜索字段中的文本更改,我不需要旧查询的结果)
我尝试在searchCompleteListener.abort()中调用doSearch(),但它在下一个查询中会导致异常:
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)
... 因此,在这种情况下,我甚至不能执行一个查询。
发布于 2014-02-25 22:26:06
一旦AJAX请求启动,就无法让android查询取消它。抱歉,你得再用一个图书馆。
可以做的是检查请求完成后是否已经过时。
您可以通过检查URL是否与您请求的最新URL相匹配来做到这一点。
if (searchResult != null && url.equals(latestRequestUrl)) {(注意,您必须让getSearchResult返回URL)
发布于 2013-09-03 17:29:27
您可以使用droidQuery库代替。使用droidQuery,可以使用调用取消所有Ajax任务:
$.ajaxKillAll();您还可以使用以下方法执行请求:
$.ajax(new AjaxOptions().url(url).header("content-type", "application/json").type("json").dataType("GET").dataType("json").success(new Function() {
@Override
public void invoke($ droidQuery, Object... params) {
JSONObject json = (JSONObject) params[0];
//TODO handle json
}
}).error(new Function() {
@Override
public void invoke($ droidQuery, Object... params) {
AjaxError error = (AjaxError) params[0];
Log.e("Ajax", "Error " + error.status + ": " + error.reason);
}
}));发布于 2016-05-25 07:10:13
您可以使用此方法中止任何查询处理。
private AjaxCallback<String> ajaxCallback = new AjaxCallback<String>(){
@Override
public void callback(String url, String object, AjaxStatus status) {
//do your processing with server response
processInformation(result);
};
};
//on our previous code
query.ajax(remoteUrl,String.class,ajaxCallback);
public void cancelAquery(){
//this statement does cancel the request i.e. we won't receive any information on callback method
//ajaxCallback.async(null);
ajaxCallback.abort();
}有关更多信息,您可以看到以下链接https://laaptu.wordpress.com/tag/android-cancelling-aquery/
https://stackoverflow.com/questions/18152055
复制相似问题