首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何中止android-query中的ajax查询?

如何中止android-query中的ajax查询?
EN

Stack Overflow用户
提问于 2013-08-09 17:09:34
回答 4查看 1.6K关注 0票数 1

我正在尝试用android查询库实现搜索自动完成。

我的活动中有回调实例:

回调:

代码语言:javascript
复制
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");
                
            }
    }
}

搜索例程,它调用文本更改:

代码语言:javascript
复制
private void doSearch(String query) {
    ppApi.getSearchResult(query, searchCompleteListener);
}  

APIClass

代码语言:javascript
复制
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(),但它在下一个查询中会导致异常:

代码语言:javascript
复制
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)
...  

因此,在这种情况下,我甚至不能执行一个查询。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-02-25 22:26:06

一旦AJAX请求启动,就无法让android查询取消它。抱歉,你得再用一个图书馆。

可以做的是检查请求完成后是否已经过时。

您可以通过检查URL是否与您请求的最新URL相匹配来做到这一点。

代码语言:javascript
复制
if (searchResult != null && url.equals(latestRequestUrl)) {

(注意,您必须让getSearchResult返回URL)

票数 1
EN

Stack Overflow用户

发布于 2013-09-03 17:29:27

您可以使用droidQuery库代替。使用droidQuery,可以使用调用取消所有Ajax任务:

代码语言:javascript
复制
$.ajaxKillAll();

您还可以使用以下方法执行请求:

代码语言:javascript
复制
$.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);
    }
}));
票数 1
EN

Stack Overflow用户

发布于 2016-05-25 07:10:13

您可以使用此方法中止任何查询处理。

代码语言:javascript
复制
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/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18152055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档